gpt4 book ai didi

c# - NHibernate:选择元素包中有条目的项目

转载 作者:行者123 更新时间:2023-12-05 05:26:07 25 4
gpt4 key购买 nike

我有一个带有列表属性的类。

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

private IList<string> _additionalPhoneNumbers;
}

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

<class name="Paperboy" table="tblPaperboy" lazy="false">
<id name="_id" column="Id" access="field" >
<generator class="assigned"/>
</id>
<property name ="_lastname" column="Lastname" access ="field" />
<property name ="_firstname" column="Firstname" access ="field" />
<property name ="_phone" column="Phone" access ="field" />
<property name ="_mobile" column="Mobile" access ="field" />

<bag name="_additionalPhoneNumbers" access="field" fetch="subselect" lazy="false" table="tblPaperboyAdditionalPhoneNumbers">
<key column="PaperboyId"/>
<element column="PhoneNumber" type="string"/>
</bag>
</class>

现在我尝试通过他们的电话号码(_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<Paperboy>();

查询结束不知道包含:

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

有人能帮帮我吗?


更新:

我被指向元素关键字。实现后我得到一个 SQL 异常。

 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<Paperboy>();

像这样的异常。

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

问题是 join 的别名没有在属性的 where 子句中使用。apn1_(哪里)与 additiona4_(连接)。

生成的 SQL:

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

最佳答案

几乎与我刚刚对之前的 NHibernate 问题给出的答案相同:QueryOver IList<string> property

基于此问答:NHibernate How do I query against an IList property?

在我试图证明(如文档中所述)的地方,我们可以使用魔法词 ".elements" :

17.1.4.1. Alias and property references

所以查询将触及您的案例中的字符串元素

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

这将支持过滤 IList<string>

关于c# - NHibernate:选择元素包中有条目的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27961444/

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