2

Nhibernate Criteriaを使用して、IN()の逆バージョンとしてしか説明できないことを実行しようとしています。

プロパティに格納されている値がリスト/コレクションXにあると言うのではなく

つまり、この値X(ID)は、オブジェクトのプロパティであるリストに含まれています。

助けていただければ幸いです。これが意味をなさない場合は、より適切に説明できるように努めます。

私はこれが十分に意味をなさないことを理解しているので、人々への謝罪を編集してください...

システムにイベントアイテムがあり、それが適用されるオーディエンス(アイテム)のリストを持つことができます。管理者がオーディエンスアイテムを削除したい場合は、そのアイテムがどのイベントからも参照されていないことを確認したいと思います。(AudienceListは、オーディエンスのIDの文字列リストとして保存されます)。

私が考えていたのは、次のようなものでした。

var results = SessionInstance.Session.CreateCriteria(typeof(EventItem.Items.EventItem)).Add(Restrictions.In( "AudienceList"、myAudience.ID)).List();

しかし、AudienceListとmyAudience.IDを逆にする必要がありますね。オーディエンスIDを持っていますが、他のIDのリストに含まれている可能性があることを確認する必要があります。

再度、感謝します。

編集2

EventItemの定義は、そのプロパティの1つがオーディエンスIDのDetailCollectionであり、IDの文字列リストとしてDBに保存されるようなものです。

4

2 に答える 2

2

編集:私の前の答えをスクラップしました。

さて、ここには真のリレーショナルモデルがないように思われるので、物事はそれほどきれいではありません。外部キーなどがなければ、NHibernateがこの状況で(少なくとも優れたクエリを生成するために)多く使用されるかどうかはわかりません。

単一のイベントレコードのすべてのオーディエンスIDが単一のフィールドに格納されている場合は、SQL LIKEを使用するか、コードで実行する必要があります。すべてのEventItemを取得して繰り返し処理し、AudienceListコレクションで探しているIDを確認します。そのルートを使用する場合は、移動するデータの量を最小限に抑えるためにDTOを作成するのが最適な場合があります。何かのようなもの

session.CreateQuery("select new AudienceListDTO(e.AudienceList) from EventItems e").List();

これは、特定のインスタンスを指摘するのではなく、「このオーディエンスタイプはまだ使用されている」ことをユーザーに通知する必要があることを前提としています。それ以外の場合は、さらにデータを追加する必要があります。

于 2009-04-29T12:58:14.750 に答える
0

このような意味ですか?

class YourClass {
    List<int> theList;
}

IQueryable<YourClass> query = ...;
var result = from c in query where c.theList.Contains(value);
于 2009-04-29T12:34:59.533 に答える