Я тут немного борюсь, поэтому подумал, почему бы не спросить:
Каждый объект в моей системе имеет список тегов (список строк), и я хочу иметь возможность искать сразу несколько тегов.
У меня есть IQueryable для работы. У каждой сущности есть список IList с именем Tags, а мой входной параметр - это список IList.
Я просто мог бы пройти через все теги и сделать IQueryable.Where (p => p.Tags.Contains (currentTag), но это не очень хорошо масштабировалось бы со многими тегами в качестве входных данных, а также у меня есть ощущение, что это можно сделать внутри LinQ.
Надеюсь, у кого-нибудь есть идея.
Обновлено: уточнение вопроса: Я ищу способ выбрать только те элементы из моего IQueryable, которые содержат ВСЕ предоставленные теги параметров (из IList).
привет Даниил / Тигрень





Не уверен, что я действительно понимаю, о чем вы спрашиваете, но, возможно, что-то вроде следующего сработает.
List<string> searchTags = ...
var query = db.MyEntity
.Where( e => e.Tags.Intersect( searchTags ).Count() > 0 );
Это должно дать вам набор сущностей, где список тегов содержит хотя бы один из элементов в searchTags.
Из здесь это какой-то sql, который вам подойдет:
SELECT entityID
FROM tags
WHERE tagID in (...) --taglist
GROUP BY entityID
HAVING COUNT(DISTINCT tagID) = ... --tagcount
Теперь уловка состоит в том, чтобы заставить Linq произвести его ... Вот код LinqToSql:
public List<int> GetEntityIds(List<int> tagIds)
{
int tagCount = tagIds.Count;
CustomDataContext myDC = new CustomDataContext();
List<int> entityIds = myDC.Tags
.Where(t => tagIds.Contains(t.TagId))
.GroupBy(t => t.entityId)
.Where(g => g.Select(t => t.TagId).Distinct().Count() == tagCount)
.Select(g => g.Key)
return entityIds;
}
Следует сделать несколько предостережений:
Я просто добавил пояснение к ответу и попробую .. Я думал о Intersecct, ... но не продолжил.