【问题标题】:NHibernate Criteria API error with create alias and a collection of projections带有创建别名和投影集合的 NHibernate Criteria API 错误
【发布时间】:2012-02-23 16:03:34
【问题描述】:

我的任务是使用 NHibernate Criteria API 生成成员数据列表。我需要基于 UI 中的复选框合并分页和过滤。使这更复杂的是,我不仅从一个实体获取数据,而且该实体与其他实体具有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,因为我已将投影列表中的所有其他投影都注释掉了。否则错误会表明“值\”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”。

【问题讨论】:

标签: c# nhibernate nhibernate-mapping nhibernate-criteria nhibernate-projections


【解决方案1】:

查询filteredlist

.SetProjection(Projections.Distinct(Projections.ProjectionList().Add(Projections.Alias(Projections.Property("MemberID"), "MemberID"))))

相同
.SetProjection(Projections.Distinct(Projections.Property("MemberID")))

这意味着查询filteredlist返回MemberID但是

var finishedList = filteredList.Future<MemberInfo>().ToList<MemberInfo>();

声明 filteredList 返回导致错误的 MemberInfo

注意:

Future() 只是一个 noop,因为您立即致电 ToList()。改成

var finishedList = filteredList.Future<int>();
var count = listCount.FutureValue<int>();

获取查询批处理

更新:

我会摆脱投影并使用

int count = CriteriaUtil.Clone(query).SetProjection(Projections.RowCount()).FutureValue<int>();
var results = query.Future<MemberInfo>();


View.MemberCount = count.Value;  // executes both sql together here
foreach (MemberInfo result in results)
{
    // do something with the result
}

【讨论】:

  • 太棒了,我会试试的。我马上要下班了,所以我要等到明天再说。还有 Projections.Alias(Projections.Property("MemberID"), "MemberID"),实际上是 Projections.Alias(Projections.Property("ManagedMemberID"), "MemberID")。这只是一个错字对不起,现在我会在离开之前编辑帖子。
  • 所以我所做的就是你提到的摆脱了我的“.ToList”,现在我可以跳过那行代码了。我现在只需要弄清楚如何获取这些数据。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多