LINQ to Entity: использование Contains в части «select» вызывает непредвиденную ошибку - PullRequest
1 голос
/ 29 апреля 2009

У меня есть запрос 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?

Спасибо

Ответы [ 4 ]

4 голосов
/ 29 апреля 2009

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

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

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;
2 голосов
/ 29 апреля 2009

По сути, сущностная структура пытается преобразовать ваш запрос LINQ в оператор SQL, но не знает, как обрабатывать Contains.

Вместо этого вы можете получить свой флот из базы данных и установить свойство isAllied позже:

var fleets = (from af in FleetSource
              select new Fleet 
              {
                  fleetID = af.fleetID,
                  fleetName = af.fleetName,
                  userId = af.userId
              }).AsEnumerable();

foreach (var fleet in fleets)
{
    fleet.isAllied = (allianceMembers.Contains(fleet.userID) ? true : false);
}
0 голосов
/ 24 июня 2010

Все выше меня не правы !!! (Без обид ...) Это не работает, потому что вы используете перегрузку IList "Contains", а не перегрузку IEnumerable "Contains". Просто измените на:

allianceMembers.Contains<int>(af.userID)

Добавляя <int>, вы говорите компилятору использовать перегрузку IEnumerable вместо перегрузки IList.

0 голосов
/ 29 апреля 2009
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().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...