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)
来避免连接,但是我无法替换附加数字中的某些字符。