gpt4 book ai didi

c# - NHibernate 如何查询 IList 属性?

转载 作者:可可西里 更新时间:2023-11-01 09:02:35 26 4
gpt4 key购买 nike

我正在尝试使用 NHibernate 查询我的一个域类上的 IList 属性。这是一个简单的例子来演示:

public class Demo
{
public Demo()
{
this.Tags = new List<string>();
}
public virtual int Id { get; set; }
public virtual string Name { get; set; }
public virtual IList<string> Tags { get; set; }
}

像这样映射:

<class name="Demo">
<id name="Id" />
<property name="Name" />
<bag name="Tags">
<key column="DemoId"/>
<element column="Tag" type="String" />
</bag>

而且我能够很好地保存和检索。现在查询 Tags 属性包含指定值的域类的实例:

var demos = this.session.CreateCriteria<Demo>()
.CreateAlias("Tags", "t")
.Add(Restrictions.Eq("t", "a"))
.List<Demo>();

错误的结果:collection was not an association: Demo.Tags

var demos = (from d in this.session.Linq<Demo>()
where d.Tags.Contains("a")
select d).ToList();

导致错误:未将对象引用设置为对象的实例。

var demos = this.session.CreateQuery("from Demo d where :t in elements(d.Tags)")
.SetParameter("t", "a")
.List<Demo>();

工作正常,但由于我的真实域类有很多属性,而且我正在构建一个复杂的动态查询,所以进行丑陋的字符串操作不是我的第一选择。我更愿意使用 ICriteria 或 Linq。我有一个用户界面,可以在其中输入许多不同的可能搜索条件。现在构建 ICriteria 的代码有几十行。我真的不想把它变成 HQL 字符串操作。

最佳答案

因此,由于 Criteria API 的限制,我决定改变我的领域类以适应。

我为标签创建了一个实体类。我什至无法将其创建为值对象。它必须有自己的 ID。

我现在觉得很脏。但对我来说,能够在不诉诸字符串操作的情况下构建动态查询比忠于领域更重要。

关于c# - NHibernate 如何查询 IList<string> 属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1209373/

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