EF 4.1 Linq to Entities Содержит работы со списком <T>, но не с T [] - PullRequest
2 голосов
/ 09 ноября 2011

Я использую Entity Framework 4.1 в базе данных SQLCE 4, и моим контекстом является DbContext.

Цель следующего кода - поиск списка записей, в которых содержится свойство ProtocolName.в данном списке.

Эта версия кода, которая предоставляет список разрешенных значений в виде списка, работает нормально:

List<string> lstPossibles = new List<string>("Name1", "Name2");
query = from le in context.DaLogEvents where lstPossibles.Contains(le.ProtocolName) select le;

Однако эта версия кода, которая предоставляет разрешенные значениякак массив выдает исключение, когда вызывается query.ToList ():

string[] aryPossibles = new string[] { "Name1", "Name2" };
query = from le in context.DaLogEvents where aryPossibles.Contains(le.ProtocolName) select le;

Сообщаемое исключение:

"LINQ to Entities не распознает метод 'BooleanСодержит метод [String] (System.String [], System.String) ', и этот метод нельзя преобразовать в выражение хранилища. "

Мне потребовалось некоторое время, чтобы выяснить, как использовать Listвместо строки [], потому что на этом сайте я видел довольно много ссылок на использование метода массива.

Это проблема только с EF 4.1?

1 Ответ

0 голосов
/ 10 ноября 2011

Использование массива «обычно» работает так же, как использование списка или любой другой реализации IEnumerable<string> - , учитывая, что метод расширения Contains является стандартным методом расширения LINQ IEnumerable<T>.

Исключение, которое вы получаете ...

...the method 'Boolean Contains[String](System.String[], System.String)'...

... удивительно, поскольку указывает на то, что компилятор не использует метод расширения LINQ.Если бы он использовал метод LINQ, исключение было бы что-то вроде:

...the method 'Boolean Contains[String](IEnumerable`1[String], System.String)'...

Или лучше: если бы он использовал этот метод, исключения не было бы вообще.

Вопросесть: у вас есть где-нибудь метод расширения Contains для string[] - либо рукописный, либо, возможно, включенный из какого-либо другого сборочного пространства / пространства имен?Что-то вроде:

public static class SomeExtensions
{
    public static bool Contains<T>(this T[] ary, T value)
    {
        // ...
    }
}

Если эта вещь используется (ваш код будет компилироваться), вы действительно получите исключение, потому что LINQ to Entities не знает, как преобразовать такой пользовательский метод в SQL (= "выражение хранилища"), независимо от того, как это реализовано.

...