Как я могу проверить, существует ли элемент дочерней коллекции Entity в другой коллекции с помощью LINQ to Entities?

Я надеюсь, что кто-то уловил идею из вопроса, но я не знал, как лучше обобщить.

Дело в том, что я пытаюсь сделать простой поиск в приложении. У меня есть объекты вопросов и тегов, подобные этим в StackOverflow, в отношениях «многие ко многим».

Я передаю массив идентификаторов тегов моему методу фильтрации. Он должен возвращать все объекты вопросов, которые имеют эти теги (с этими идентификаторами). Я сделал это так:

int[] tagIds = { 1, 2, 3};
var questions = myEntities.Questions
                    .ToList()
                    .Where(q => tagIds.Intersect(q.Tags.Select(t => t.Id).ToArray()).Any())
                    .ToList();

Все работало нормально, но теперь я добавил больше фильтров и методов, использующих этот фильтр, поэтому я хочу получить объект DbQuery вместо списка.

Я попытался удалить выражения .ToList(), чтобы получить соответствующий результат:

int[] tagIds = { 1, 2, 3};
var questions = myEntities.Questions
                    .Where(q => tagIds.Intersect(q.Tags.Select(t => t.Id).ToArray()).Any());

К сожалению, я получаю исключение, указывающее, что LINQ не распознает метод .ToArray(). Может ли кто-нибудь дать мне лучшее представление о том, как этого добиться?


person Yulian    schedule 08.08.2014    source источник
comment
вам не нужно использовать toArray, я думаю   -  person T_D    schedule 08.08.2014
comment
Да! Спасибо, вы правы. Вы можете опубликовать это как ответ, чтобы я мог отметить его как лучший. Спасибо еще раз!   -  person Yulian    schedule 08.08.2014


Ответы (1)


Метод ToArray() даже не нужен в

.Where(q => tagIds.Intersect(q.Tags.Select(t => t.Id).ToArray())

потому что Intersect просто нужен IEnumerable, который Select уже возвращает, а не обязательно массив.

person T_D    schedule 08.08.2014