1

私は Nhibernate を使用しています。これは、複合キーのリストを使用して一連のレコードを取得するためのコードによるマッピングです。次のような複合キーを使用しています。

public class PersonAccountKey : IKey
{
        public virtual string PersonId { get; set; }
        public virtual string AccountNo{ get; set; }

        public override bool Equals(object obj)
        {
            if (obj == null)
                return false;
            var t = obj as PersonKey;
            if (t == null)
                return false;
            if (PersonId == t.PersonId && AccountNo == t.AccountNo)
                return true;
            return false;
        }
        public override int GetHashCode()
        {
            return (PersonId).GetHashCode() + "|" + (AccountNo).GetHashCode();
        }
}

PersonAccountKey オブジェクトのリストを使用して、NHibernate に単一のクエリをデータベースに送信させようとしています。クエリは次のようになると思います。

Select PersonId, AccountNo, AccountNickName 
From PersonAccount 
Where (PersonId = '11' and AccountNo = '10001111') 
or (PersonId = '22' and AccountNo = '10001150')

これを達成する方法がわかりませんか?複合キーで Criteria を使用しようとしましたが、一緒に使用するためのものではなかったと思います。私は今Linq 2 NHibernateを試していますが、実際にはどこにも行きません。

理想的には、 などのキーの IEnumerable を取るメソッドが欲しいのですSession.Get<T>(IEnumerable<object>)が、これは私の検索では存在しません。

これは NHibernate ですぐに使用できますか?

乾杯。

4

2 に答える 2

0

スカラーIDとは異なり、複合キーのリストをクエリパラメーターとして使用するための直接的なサポートはありません。これは、複合キーを避ける必要がある理由のもう1つの例です。

簡単な回避策は次のとおりです。

IEnumerable<PersonAccountKey> keys = GetKeys();
var query = session.CreateCriteria<PersonAccount>();
var keyCriterion = Restrictions.Disjunction();
foreach (var key in keys)
    keyCriterion.Add(Restrictions.Eq("id", key));
query.Add(keyCriterion);
var result = query.List<PersonAccount>();
于 2012-08-24T15:29:32.913 に答える
0

Enumerable.Containsに関する MSDN の記事があります。

NHibernate の linq がこれをサポートしているかどうかはわかりません。例外的にお断りする場合がございます。

于 2012-08-24T01:29:16.553 に答える