NHibernate:选择带有元素包中条目的项目

我有一个列表属性的类。

public class Paperboy{ private int _id; private string _lastname; private string _firstname; private string _mobile; private string _phone; private IList _additionalPhoneNumbers; } 

列表被映射为带有键和元素的包。

              

现在我尝试通过电话号码(_phone,_mobile或_additionalPhoneNumbers)选择paberboys。 _phone和_mobile没有问题,但我坚持使用额外的数字。

我尝试了标准api和查询。

Criteria Api不知道属性AdditionalPhoneNumbers

 ICriteria criteria = session.CreateCriteria(typeof(Paperboy)); criteria.CreateAlias("_additionalPhoneNumbers", "AdditionalPhoneNumbers"); Disjunction or = Restrictions.Disjunction(); or.Add(Restrictions.Eq("_phone", number)); or.Add(Restrictions.Eq("_mobile", number)); or.Add(Restrictions.Eq("AdditionalPhoneNumbers", number)); criteria.Add(or); criteria.SetMaxResults(1); return criteria.UniqueResult(); 

查询结束不知道包含:

  return query.Where(p => p.Mobile == number || p.Phone == number p.AdditionalPhoneNumbers.Contains(number)).Take(1).SingleOrDefault(); 

有人可以帮帮我吗?


更新:

我被指向了elements-keyword。 实现后我得到一个SQL-Exception。

  ICriteria criteria = session.CreateCriteria(typeof(Paperboy)); criteria.CreateAlias("_additionalPhoneNumbers", "APN"); Disjunction or = Restrictions.Disjunction(); or.Add(Restrictions.Eq("APN.elements", number)); criteria.Add(or); criteria.SetMaxResults(1); return criteria.UniqueResult(); 

像这样的例外。

System.Data.SqlClient.SqlException: Der mehrteilige Bezeichner 'apn1_.PhoneNumber' konnte nicht gebunden werden.

问题是连接的别名未在属性的where子句中使用。 apn1_(where)与additiona4_(加入)。

制作SQL:

[SELECT TOP (@p0) this_.Id as Id3_1_, this_.BusinessId as BusinessId3_1_, this_.AgencyKey as AgencyKey3_1_, this_.Lastname as Lastname3_1_, this_.Firstname as Firstname3_1_, this_.Title as Title3_1_, this_.Street as Street3_1_, this_.Zip as Zip3_1_, this_.City as City3_1_, this_.Phone as Phone3_1_, this_.Mobile as Mobile3_1_, this_.Comment as Comment3_1_, this_.StaffId as StaffId3_1_, this_.IsActive as IsActive3_1_, agency3_.Id as Id1_0_, agency3_.BusinessId as BusinessId1_0_, agency3_.RegionKey as RegionKey1_0_, agency3_.Shorttext as Shorttext1_0_, agency3_.Longtext as Longtext1_0_, agency3_.CompanyCodeId as CompanyC6_1_0_ FROM tblPaperboy this_ left outer join tblAgency agency3_ on this_.AgencyKey=agency3_.Id inner join tblPaperboyAdditionalPhoneNumbers additiona4_ on this_.Id=additiona4_.PaperboyId WHERE (apn1_.PhoneNumber = @p1)]

我刚才给出的NHibernate问题答案几乎相同: QueryOver IList 属性

基于此问答: NHibernate如何查询IList属性?

在我试图表明的地方(如文档中所述),我们可以使用神奇的单词".elements"

17.1.4.1。 别名和属性引用

因此查询将触及您案例中的字符串元素

 //or.Add(Restrictions.Eq("AdditionalPhoneNumbers", number)); or.Add(Restrictions.Eq("AdditionalPhoneNumbers.elements", number)); 

这将支持过滤IList

好像NHibernate <4有一个创建连接的错误。 在RadimKöhler和firo的帮助下( 见其他帖子 )我最终使用了HQL:

 select paperboy from Paperboy as paperboy left join paperboy._additionalPhoneNumbers number where paperboy._mobile = :nr or paperboy._phone = :nr or number = :nr 

也可以通过:nr in elements(paperboy._additionalPhoneNumbers)使用:nr in elements(paperboy._additionalPhoneNumbers)来避免连接,但是我无法替换附加数字中的某些字符。