2013-09-18 2 views
1

У меня есть следующие (упрощенно), многие-ко-многим:Найти объекты, которые соответствуют всем элементам списка в списке

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(); 

Как я могу achive, чтобы получить список, содержащий продукты, которые имеют все имена тегов?

ответ

1

Предполагая, что ваш класс 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(); 

Бьюсь об заклад, существует менее сложный ответ, просто его не найти. Надеюсь, это все равно поможет.

Смежные вопросы