1

関連するクラスは次のとおりです。

public class Item {
    public virtual int Id { get; protected set; }
    public virtual IList<Tag> Tags { get; set; }
}

public class Tags {
    public virtual int Id { get; protected set; }
    public virtual string Name { get; set; }
    public virtual IList<Item> Items { get; set; }
}

これらは、多対多の関連付けでマッピングされます。中間テーブルの名前は ItemsToTags です。

質問は次のとおりです。

文字列のリストが与えられた場合、指定されたリスト内のすべての文字列に一致するs を持つすべてのsItemを持つすべての sを返す NHibernate クエリを作成するにはどうすればよいですか?TagName

これは関数のシグネチャです:

IList<Item> GetItemsWithTags(IList<string> tagNames);

次のようなものが必要です:

from Item item
where !tagsNames.Except(
    from item.Tags select item.Tags.Name
).Any()
select item

助けてくれてありがとう。

4

1 に答える 1

2

これは HQL で確実に実行できます。私はそれをうまくテストしました。

var items = session.CreateQuery("SELECT i.Id FROM Item i JOIN i.Tags tags WHERE tags.Name IN(:tags) GROUP BY i HAVING COUNT(DISTINCT tags) = :tagCount")
        .SetParameterList("tags", tagNames)
        .SetInt32("tagCount", tagNames.Count)
        .List();

Itemこれにより、sを取得するために使用できる IDのリストが取得されますItemGROUP BYただし、 とのHAVING組み合わせは、一部の DBMS では非効率的である場合があります。特定の DBMS でより効率的な反復結合を使用する別のクエリ方法がありますが、動作させることができません (基準ではまったく不可能な場合があります)。もしそうなら、答えを更新します。

于 2009-06-04T22:32:57.493 に答える