1

次の(単純化された)多対多の関係があります。

public class Tag
{
    public string Name { get; set; }
    public IList<Product> Products { get; set; }
}

public class Product
{
    public IList<Tag> Tags { get; set; }
}

次のスニペットは、少なくとも 1 つのタグに一致するすべての製品を返します。

var searchTags = new[] {"tag1", "tag3"};
Tag tagAlias = null;
var query = _session.QueryOver<Product>()
               .JoinAlias(p => p.Tags, () => tagAlias)
               .WhereRestrictionOn(() => tagAlias.Name).IsIn(searchTags)
               .List();

すべてのタグ名を持つ製品を含むリストを取得するにはどうすればよいですか?

4

1 に答える 1

2

Productクラスに少なくともプロパティがあると仮定すると、Id次のようなものを使用できます。複数のIdプロパティがある場合は、これらすべてのプロパティを明示的に選択する必要があります。

var searchTags = new[] { "tag1", "tag3" };
Tag tagAlias = null;

Product pr = null, resProduct = null;

var products = 
    session.QueryOver(() => pr)
        .JoinAlias(() => pr.Tags, () => tagAlias)
        .WhereRestrictionOn(() => tagAlias.Name).IsIn(searchTags)
        .SelectList(list => list
                                .SelectGroup(p => p.Id)
                                .SelectCount(p => tagAlias.Name))
        .Where(Restrictions.Eq(Projections.Count<Product>(p => tagAlias.Name),
                                searchTags.Length))
        .SelectList(list => list
                                .SelectGroup(p => p.Id).WithAlias(() => resProduct.Id))
        .TransformUsing(Transformers.AliasToBean<Product>())
        .List();

それほど複雑ではない答えがあるに違いありませんが、それを見つけることができません。とにかくこれが役立つことを願っています。

于 2013-09-18T14:37:32.697 に答える