Как правильно составить запрос с Any()?

Рейтинг: 1Ответов: 2Опубликовано: 29.11.2014

Доброго времени суток!

Есть необходимость получить выборку постов из БД (использую Entity Framework).
Подскажите, пожалуйста, как правильно написать запрос на линк.

Суть:
Есть таблица с подписками для пользователя, в ней может быть несколько строк значений.

List<TRM_Subscribers> userSubscribers =sdb.TRM_Subscribers.Where(x => x.UserID == 1).ToList();

Также есть сами посты: (по двум параметрам из userSubscribers я хочу сделать выборку: IDCategory;idObj ;)

postses = sdb.TRM_Posts.Where(x => x.IDCategory==1 || userSubscribers.Any(g => g.IDObj == x.idObj && g.IDCat == x.IDCategory)).ToList();

На меня компилятор ругается: Unable to create a constant value of type 'Project.Models.TRM_Subscribers'. Only primitive types or enumeration types are supported in this context.

Ответы

▲ 4Принят
List<TRM_Subscribers> userSubscribers =sdb.TRM_Subscribers.Where(x => x.UserID == 1).ToList();

замените на

var query=sdb.TRM_Subscribers.Where(x => x.UserID == 1);
List<TRM_Subscribers> userSubscribers =query.ToList();

postses = sdb.TRM_Posts.Where(x => x.IDCategory==1 || query.Any(g => g.IDObj == x.idObj && g.IDCat == x.IDCategory)).ToList();
▲ 1

Ну, проблема-то ясна: userSubscribers у вас не IQueryable (из-за .ToList()), а IEnumerable, так что LINQ-провайдер не может странслировать код userSubscribers.Any(g => g.IDObj == x.idObj && g.IDCat == x.IDCategory) в SQL-запрос. Может быть, достаточно будет избавиться от материализации?