gpt4 book ai didi

c# - NHibernate QueryOver - 结果太多的集合

转载 作者:行者123 更新时间:2023-11-30 23:13:46 26 4
gpt4 key购买 nike

尊敬的 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-property 中查询那些 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 不理解我的意思(..或者是反过来?)。

非常感谢任何有关如何使我的查询适用于我的 OPTION 包集合的帮助! :-) 谢谢!

米迦勒

最佳答案

恐怕他的方法行不通。通过设计和性质 <join> .如文档中所述:

5.1.19. join

Using the <join> element, it is possible to map properties of one class to several tables, when there's a 1-to-1 relationship between the tables.

(我这样做)解决这个问题的方式有点不同。我有一个对象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>

然后,我们可以为当前 session 的所有操作打开过滤器。每个请求(如果是网络应用程序)只有一次,在一些 AOP 中,我们知道语言 ID:

var filter = session.EnableFilter("LanguageFilter");
filter.SetParameter("languageId", theCurrentLanguageIdFromUser);

最后,我们知道,Languages 集合只包含一条记录,我们始终可以访问 .First() .不再有更多语言的多个结果

另见:https://stackoverflow.com/a/16625867/1679310 , https://stackoverflow.com/a/18479266/1679310

关于c# - NHibernate QueryOver - 结果太多的集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18784983/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com