NHibernate Criteria API 错误,创建别名和投影集合
我的任务是使用 NHibernate Criteria API 生成成员数据列表。我需要根据用户界面中的复选框合并分页和过滤。使这一点变得更复杂的是,我不仅从一个实体获取数据,而且该实体与其他实体具有 HasMany
关系。
我目前有一个错误:
Error executing multi Criteria:
[SELECT DISTINCT TOP 1000 this_MemberID as y0_
FROM _Members
Left Outer Join _SubMemberTerms ON _SubMemberTerms.MemberID = this_.MemberID
Left Outer Join _MemberTerms ON _MemberTerms.MemberID = this_.MemberID
Left Outer Join _ScriptOption ON _ScriptOption.ID = _MemberTerms.ScriptOpID
WHERE _MagazineID = 100
AND
(_ScriptOption.MagID IN (1234,5678,9101,.....)
OR _ScriptOption.MemberID IS NULL
OR _ScriptOption.Active = 0)
AND
(_SubMemberTerms._ScriptOpID IN (1234,5678,9101,.....)
OR _SubMemberTerms.ID IS NULL);]
内部异常是:值“5554302”不是类型 \"MyBusiness.MemberInfo\" 且不能在此通用中使用 收藏。参数名称:值。
现在我只是查看会员的 ID,因为我评论了我的投影列表中的所有其他投影。否则错误会指出“The Value \”System.object[]\”...
我的条件代码:
var filteredList = CurrentSession.CreateCriteria<MemberInfo>("this_")
.SetProjection(Projections.Distinct(Projections.ProjectionList()
.Add(Projections.Alias(Projections.Property("ManagedMemberID"), "MemberID"))))
.Add(Restrictions.Eq("_MagazineID", (int)magID))
.CreateAlias("MemTermsList", "_MemberTerms", NHibernate.SqlCommand.JoinType.LeftOuterJoin)
.CreateAlias("_MemberTerms.ScriptOpInfo", "_ScriptOption", NHibernate.SqlCommand.JoinType.LeftOuterJoin)
.CreateAlias("SubTermsList", "_SubMemberTerms", NHibernate.SqlCommand.JoinType.LeftOuterJoin)
.SetFirstResult(startposition)
.SetMaxResults(1000);
我还有一个 Criteria
用于获取总查询的计数,而不仅仅是返回的 1k 与我为 filteredList
所做的 Criteria
相同
//code for how I'm adding in the MagID's and ScriptOpId's
Disjunction magDisjunction = new Disjunction();
Disjunction subTermsDijunction = new Disjunction();
if(TheCheckBoxThatAppliesIsChecked)
{
magDisjunction.Add(Restrictions.In("_ScriptOption.MagID", (List<int>)selectedMags))
.Add(Restrictions.IsNull("_MemberTerms.MemberID"))
.Add(Restrictions.Eq("_MemberTerms.Active", false));
filteredList.Add(magDisjunction);
}
if(TheOtherCheckBoxThatAppliesIsChecked)
{
subTermsDisjunction.Add(Restrictions.In("_SubMemberTerms.SciptOpID", (List<int>)selectedScriptOp))
.Add(Restrictions.IsNull("_SubMemberTerms.SubMemberTermsID"));
filteredList.Add(subTermsDisjunction);
}
var finishedList = filteredList.Future<MemberInfo>().ToList<MemberInfo>();
var count = listCount.FutureValue<int>().Value;
: 我的投影中出现拼写错误。别名,将“MemberID”切换为“ManagedMemberID”。
I'm tasked with generating a list of member data using the NHibernate Criteria API. I need to incorporate paging and filtering based on checkboxes in the UI. What makes this a bit more complex is that I'm not just fetching data from one entity, but this entity has a HasMany
relationship to other entities.
I currently have an error:
Error executing multi Criteria:
[SELECT DISTINCT TOP 1000 this_MemberID as y0_
FROM _Members
Left Outer Join _SubMemberTerms ON _SubMemberTerms.MemberID = this_.MemberID
Left Outer Join _MemberTerms ON _MemberTerms.MemberID = this_.MemberID
Left Outer Join _ScriptOption ON _ScriptOption.ID = _MemberTerms.ScriptOpID
WHERE _MagazineID = 100
AND
(_ScriptOption.MagID IN (1234,5678,9101,.....)
OR _ScriptOption.MemberID IS NULL
OR _ScriptOption.Active = 0)
AND
(_SubMemberTerms._ScriptOpID IN (1234,5678,9101,.....)
OR _SubMemberTerms.ID IS NULL);]
The Inner exception is: The value \"5554302\" is not of type
\"MyBusiness.MemberInfo\" and cannot be used in this generic
collection. Parameter name: value.
Right now I'm just looking at the Member's ID because I commented every other projection in my projection list out. Otherwise the error would've stated "The Value \"System.object[]\"...
My Criteria Code:
var filteredList = CurrentSession.CreateCriteria<MemberInfo>("this_")
.SetProjection(Projections.Distinct(Projections.ProjectionList()
.Add(Projections.Alias(Projections.Property("ManagedMemberID"), "MemberID"))))
.Add(Restrictions.Eq("_MagazineID", (int)magID))
.CreateAlias("MemTermsList", "_MemberTerms", NHibernate.SqlCommand.JoinType.LeftOuterJoin)
.CreateAlias("_MemberTerms.ScriptOpInfo", "_ScriptOption", NHibernate.SqlCommand.JoinType.LeftOuterJoin)
.CreateAlias("SubTermsList", "_SubMemberTerms", NHibernate.SqlCommand.JoinType.LeftOuterJoin)
.SetFirstResult(startposition)
.SetMaxResults(1000);
I also have a Criteria
made for getting the count of the total query and not just the 1k returned. It's the same as the Criteria
I made for filteredList
.
//code for how I'm adding in the MagID's and ScriptOpId's
Disjunction magDisjunction = new Disjunction();
Disjunction subTermsDijunction = new Disjunction();
if(TheCheckBoxThatAppliesIsChecked)
{
magDisjunction.Add(Restrictions.In("_ScriptOption.MagID", (List<int>)selectedMags))
.Add(Restrictions.IsNull("_MemberTerms.MemberID"))
.Add(Restrictions.Eq("_MemberTerms.Active", false));
filteredList.Add(magDisjunction);
}
if(TheOtherCheckBoxThatAppliesIsChecked)
{
subTermsDisjunction.Add(Restrictions.In("_SubMemberTerms.SciptOpID", (List<int>)selectedScriptOp))
.Add(Restrictions.IsNull("_SubMemberTerms.SubMemberTermsID"));
filteredList.Add(subTermsDisjunction);
}
var finishedList = filteredList.Future<MemberInfo>().ToList<MemberInfo>();
var count = listCount.FutureValue<int>().Value;
EDIT:
I had a typo in my projections.Alias, switched form "MemberID", to "ManagedMemberID".
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
查询
filteredlist
haswhich 与 which 相同
,这意味着查询
filteredlist
返回MemberID
但声明
filteredList
返回 MemberInfo这会导致错误注意:
Future()
只是一个noop,因为您立即调用ToList()
。将其更改为获取查询批处理
更新:
我将摆脱投影并使用
query
filteredlist
haswhich is the same as
which means that the query
filteredlist
returnsMemberID
butstates that
filteredList
returns MemberInfo which results in the errorNOTE:
the
Future()
is just a noop since you are callingToList()
immediatly. change it toto get query batching
Update:
I would get rid of the Projection and use