Как сделать запрос "в" в рамках сущности? - PullRequest
49 голосов
/ 16 июля 2009

Как я могу сделать выбор в linq для объектов, чтобы выбрать строки с ключами из списка? Примерно так:

var orderKeys = new int[] { 1, 12, 306, 284, 50047};
var orders = (from order in context.Orders 
              where (order.Key in orderKeys) 
              select order).ToList();
Assert.AreEqual(orderKeys.Count, orders.Count);

Я попытался использовать метод Contains , как упоминалось в некоторых ответах, но он не работает и выдает это исключение:

LINQ to Entities не распознает метод 'Boolean Contains [Int32] (System.Collections.Generic.IEnumerable`1 [System.Int32], Int32)', и этот метод нельзя преобразовать в хранилище выражение.

Ответы [ 3 ]

41 голосов
/ 16 июля 2009

Попробуйте это:

var orderKeys = new int[] { 1, 12, 306, 284, 50047};
var orders = (from order in context.Orders 
              where orderKeys.Contains(order.Key);
              select order).ToList();
Assert.AreEqual(orderKeys.Count, orders.Count);

Редактировать: Я нашел обходные пути для этой проблемы - см. Предложение WHERE IN? :

Entity Framework не делает в настоящее время поддерживают коллекционные Параметры ('statusesToFind' в вашем пример). Чтобы обойти это ограничение, вы можете вручную построить выражение с учетом последовательность значений с использованием следующего служебный метод:

21 голосов
/ 29 декабря 2010

У меня была такая же проблема, и я решил вот так

var orderKeys = new int[] { 1, 12, 306, 284, 50047};
var orders = (from order in context.Orders 
              where (orderKeys.Contains(order.Key)) 
              select order).ToList();
Assert.AreEqual(orderKeys.Count, orders.Count);
8 голосов
/ 16 июля 2009

К сожалению, EF не может перевести запросы, предложенные другими. Поэтому, хотя эти запросы будут работать в LINQ to Objects, они не будут работать в LINQ to Entities.

Так что решение немного сложнее.

Однако у меня есть пост в блоге на эту тему здесь . По сути, решение состоит в том, чтобы использовать маленькую магию дерева выражений для создания большого выражения OR.

Надеюсь, это поможет

Alex

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