NHibernate QueryOver - 包含太多结果的集合
本文关键字:结果 集合 太多 包含 QueryOver NHibernate | 更新日期: 2023-09-27 18:31:21
亲爱的NHibernate用户,
我已经尝试、阅读和其他东西 2 天了,但仍然无法弄清楚这一点,即使我认为使用 QueryOver API 是一项简单的任务。
这是我的两个实体:
ATTRIBUTE
---------------------------
public int Id { get; set; }
public int LanguageId { get; set; }
public string Title { get; set; }
public IList<Option> Options { get; set; }
OPTION
---------------------------
public int Id { get; set; }
public Attribute Attribute { get; set; }
public int LanguageId { get; set; }
public string Title { get; set; }
映射如下:
<class name="Attribute" lazy="false" table="attribute" dynamic-insert="true" dynamic-update="true" select-before-update="true">
<id name="Id" column="attribute_id" type="System.Int32">
<generator class="native"/>
</id>
<bag name="Options" lazy="false" cascade="all">
<key column="attribute_id" not-null="true" />
<one-to-many class="Option" not-found="ignore" />
</bag>
<join table="attribute_i18n" inverse="true" fetch="join">
<key column="attribute_id" not-null="true"/>
<property name="LanguageId" column="language_id" type="System.Int32" not-null="true" />
<property name="Title" column="title" type="System.String" length="255" not-null="true" />
</join>
</class>
<class name="Option" lazy="false" table="options" dynamic-insert="true" dynamic-update="true" select-before-update="true">
<id name="Id" column="option_id" type="System.Int32">
<generator class="native"/>
</id>
<many-to-one name="Attribute" class="Attribute" column="attribute_id" not-null="true" />
<join table="option_i18n" inverse="true" fetch="join">
<key column="option_id" not-null="true"/>
<property name="LanguageId" column="language_id" type="System.Int32" not-null="true" />
<property name="Title" column="title" type="System.String" length="255" not-null="true" />
</join>
</class>
请注意,这两个表都连接到其自己的"i18n"表(支持多语言条目),并引用其language_id列。
此外,我尝试使用 QueryOver API,并在 Options-属性中查询那些将 LanguageId 设置为 1 的选项。
经过大量的拔毛,我的查询又回到了我开始的内容:
Attribute attribute = null;
Option option = null;
result = Session.QueryOver(() => attribute)
.Where(() => attribute.LanguageId == 1)
.Left.JoinAlias(i => i.Options, () => option)
.Where(() => option.LanguageId == 1)
.TransformUsing(Transformers.DistinctRootEntity)
.List();
所以,对于我的问题:此查询不断在我的选项列表中为我提供一组双组选项(对于language_id 1 和 2)。我只想选择 language_id = 1,但令我沮丧的是 API 不理解我(..还是相反?
非常感谢有关如何使我的查询针对我的选项袋集合的任何帮助! :-) 谢谢!
米卡尔
他的行不通。通过设计和<join>
的性质.如文档中所述:
5.1.19. 加入
使用
<join>
元素,可以将一个类的属性映射到多个表,当 表之间存在 1 对 1 的关系。
如何(我确实)解决这个问题的方式有点不同。我有一个对象Language
,该选项具有语言的集合
public virtual IList<Language> Languages {get; set;}
例如,映射<bag>
<bag name="Languages" batch-size="25"
cascade="all-delete-orphan" inverse="true" >
<key column="option_id" />
<one-to-many class="Language" />
<filter name="LanguagFilter" condition=":languageId = LanguageId" />
</bag>
诀窍在于过滤器。这是 where 映射属性 (18.1.NHibernate过滤器)
<filter-def name="LanguageFilter" >
<filter-param name="languageId" type="Int32" />
</filter-def>
然后,我们可以为当前会话的所有操作打开过滤器。每个请求(如果是 Web 应用程序)只有一次,在某个 AOP 中,我们知道语言 ID:
var filter = session.EnableFilter("LanguageFilter");
filter.SetParameter("languageId", theCurrentLanguageIdFromUser);
最后,我们知道,集合 语言 只包含一个记录,我们可以随时访问 .First()
.使用更多语言不再有多重结果
另请参阅:https://stackoverflow.com/a/16625867/1679310、https://stackoverflow.com/a/18479266/1679310