LINQ to Entity: использование Contains в части «select» вызывает непредвиденную ошибку

c# entity-framework linq-to-entities

Вопрос

У меня есть запрос LINQ, идущий против объекта Entity Framework. Вот краткое изложение запроса:

//a list of my allies
List<int> allianceMembers = new List<int>() { 1,5,10 };

//query for fleets in my area, including any allies (and mark them as such)
var fleets = from af in FleetSource
             select new Fleet 
             {
                 fleetID = af.fleetID,
                 fleetName = af.fleetName,
                 isAllied = (allianceMembers.Contains(af.userID) ? true : false)
             };

По сути, то, что я делаю, - это набор флотов. Список allianceMembers содержит INT всех пользователей, которые связаны со мной. Я хочу установить isAllied = true, если владелец флота является частью этого списка, и false в противном случае.

Когда я делаю это, я вижу исключение: «LINQ to Entities не распознает метод« Boolean Contains (Int32) »»

Я могу понять, как получить эту ошибку, если бы я использовал содержащуюся в части запроса часть where, но зачем мне ее получать в select? К этому моменту я предполагаю, что запрос будет выполнен и вернет результаты. Этот маленький кусочек кода вообще ничего не делает для ограничения моих данных.

Любые советы о том, как еще я могу сделать то, что мне нужно, с установкой флага isAllied?

Спасибо

Принятый ответ

var fleets = from af in FleetSource;

var x = from u in fleets.ToList()
                         select new Fleet
                         {
                            fleetID = u.fleetID,
                            fleetName = u.fleetName,
                            isAllied = (allianceMembers.Contains(u.userID) ? true : false)
                         }

вызов ToList() для флотов, запрос выполняется, позже вы можете использовать Contains() .


Популярные ответы

Это пашет из предыдущего ответа ...

Содержит не поддерживается.

IN и JOIN не являются одним и тем же оператором (фильтрация по IN никогда не изменяет мощность запроса).

Вместо этого используйте метод join. Это несколько трудно понять без использования операторов запросов, но как только вы получите его, вы получите его.

var foo = 
model.entitySet.Join(  //Start the join
values, //Join to the list of strings
e => e.Name, // on entity.Name
value => value, //equal to the string
(ModelItem ent, String str) => ent);//select the entity

Здесь используется оператор запроса

var foo = from e in model.entitySet
join val in values on
e.Name equals val
select e;


Related

Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow