Nhibernate 查找与列表中所有列表元素匹配的实体

Nhibernate 查找与列表中所有列表元素匹配的实体,nhibernate,queryover,Nhibernate,Queryover,我有以下(简化的)多对多关系: public class Tag { public string Name { get; set; } public IList<Product> Products { get; set; } } public class Product { public IList<Tag> Tags { get; set; } } 公共类标记 { 公共字符串名称{get;set;} 公共IList产品{get;set;} }

我有以下(简化的)多对多关系:

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

public class Product
{
    public IList<Tag> Tags { get; set; }
}
公共类标记
{
公共字符串名称{get;set;}
公共IList产品{get;set;}
}
公共类产品
{
公共IList标记{get;set;}
}
以下代码段返回至少与一个标记匹配的所有产品:

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

如何获得包含具有所有标记名的产品的列表?

假设您的
产品
类至少具有
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();
var searchTags=new[]{“tag1”、“tag3”};
tagAlias=null;
Product pr=null,resProduct=null;
var乘积=
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(projects.Count(p=>tagAlias.Name)),
搜索标签(长度)
.SelectList(list=>list
.SelectGroup(p=>p.Id)。带别名(()=>resProduct.Id))
.TransformUsing(Transformers.AliasToBean())
.List();
我打赌有一个不那么复杂的答案,就是找不到。希望这会有所帮助