0

NHibernateCriteriaAPIを使用してメンバーデータのリストを生成する必要があります。UIのチェックボックスに基づくページングとフィルタリングを組み込む必要があります。これをもう少し複雑にしているのは、1つのエンティティからデータをフェッチしているだけでなく、このエンティティが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だけでなく、クエリ全体のカウントを取得するために作成しました。Criteriaそれは私がのために作ったものと同じです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;

編集:projections.Aliasにタイプミスがあり、「MemberID」から「ManagedMemberID」に切り替えました。

4

1 に答える 1

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()は単なるヌープ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
}
于 2012-02-23T16:13:25.060 に答える