Csharp/C#教程:NHibernate如何查询IList 属性?分享


NHibernate如何查询IList 属性?

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

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

映射如下:

        

我能够保存和检索就好了。 现在查询我的域类的实例,其中Tags属性包含指定的值:

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

导致错误:集合不是关联:Demo.Tags

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

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

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

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

因此,由于Criteria API的限制,我决定弯曲我的域类以适应。

我为Tag创建了一个实体类。 我甚至无法将其创建为值对象。 它必须有自己的id。

我现在觉得很脏 但是,能够构建动态查询而不诉诸字符串操作对我来说比对域保持真实更重要。

如下所述:

17.1.4.1。 别名和属性引用

我们可以用:

 ... A collection key {[aliasname].key} ORGID as {coll.key} The id of an collection {[aliasname].id} EMPID as {coll.id} The element of an collection {[aliasname].element} XID as {coll.element} ... 

doc中有一个小错误…而不是".element"我们必须使用".elements"

 var demos = this.session.CreateCriteria() .CreateAlias("Tags", "t") // instead of this // .Add(Restrictions.Eq("t", "a")) // we can use the .elements keyword .Add(Restrictions.Eq("t.elements", "a")) .List(); 

您需要使用SubCriterias而不是别名。 这应该工作:

 var demos = this.session.CreateCriteria() .CreateCriteria("Tags") .Add(Restrictions.Eq("Tag", "a")) .List(); 

HQL:

 from Demo d where :val in elements(d.Tags) 

切换到字符串上的类是一种妥协。 另一个是使用HQL而不是ICriteria。 然而,还有第三个折衷方案……使用自定义SQL。 试试吧。

 var demos = Session.CreateCriteria() .Add(Expression.Sql( "EXISTS (SELECT 1 FROM [Tags] custom_sql_t WHERE custom_sql_t.[DemoId] = {alias}.[Id] AND custom_sql_t.[Tag] = ?)", "a", NHibernateUtil.String)) .List(); 

这导致后续SQL由NHibernate 2.1.2.4000生成…

 exec sp_executesql N'SELECT this_.Id as Id2_0_, this_.Version as Version2_0_, this_.Name as Name2_0_ FROM Demo this_ WHERE EXISTS (SELECT 1 FROM [Tags] custom_sql_t WHERE custom_sql_t.[DemoId] = this_.[Id] AND custom_sql_t.[Tag] = @p0)',N'@p0 nvarchar(1)',@p0=N'a' 

请看这篇文章的另一个例子……

NHibernate – 从一组值类型(非实体)中查询以解决选择N + 1

这可以通过创建单独的标准来实现:

上述就是C#学习教程:NHibernate如何查询IList 属性?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

 ICriteria demoCriteria = session.CreateCriteria(); ... demoCriteria.Add(Restrictions...); ... ICriteria tagCriteria = demoCriteria.CreateCriteria("Tags"); tagCriteria.Add(Restrictions.In("elements", new {"Tag1", "Tag2", ...})); return demoCriteria.List(); 

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/1004853.html

(0)
上一篇 2021年12月28日
下一篇 2021年12月28日

精彩推荐