我有以下(简化)多对多关系:
public class Tag
{
public string Name { get; set; }
public IList<Product> Products { get; set; }
}
public class Product
{
public IList<Tag> Tags { 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();
如何获得包含所有标记名称的产品的列表?
答案 0 :(得分: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();
我打赌有一个不太复杂的答案,就是找不到它。希望这无论如何都会有所帮助。