Почему я не могу повторно использовать функцию в LINQ to SQL - PullRequest
3 голосов
/ 21 января 2010

Почему приведенная ниже инструкция LINQ to SQL вызывает исключение?

У меня есть функция

bool TrimAndCompare(string s1, string s2)
{
   return customer.CustomerID.Trim() == customerID.Trim()
}

... какая-то другая функция, которую я вызываю вышеупомянутой функцией в моем выражении linq

var customers = from customer in _context.Customers
                          where
                              TrimAndCompare(customer.CustomerID, customerID)
                      select customer;

Приведенная выше функция статистики LINQ to SQL генерирует исключение но ниже не почему ??

var customers = from customer in _context.Customers
                      where
                            customer.CustomerID.Trim() == customerID.Trim()
                      select customer;

Я получаю исключение System.NotSupportedException где я пытаюсь получить доступ к клиентам

1 Ответ

8 голосов
/ 21 января 2010

Во втором фрагменте логика переводится в лямбда-выражение, которое затем компилируется в дерево выражений ... два перевода запроса:

_context.Customers
        .Where(customer => TrimAndCompare(customer.CustomerID, customerID);

против

_context.Customers
        .Where(customer => customer.CustomerID.Trim() == customerID.Trim());

LINQ to SQL знает, как обрабатывать деревья выражений, и знает Trim и равенство строк. Он не знает, как обрабатывать вызовы произвольных методов, которые вы написали.

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

Expression<Func<Customer, bool>> CustomerIdMatches(string customerID)
{
   return customer => customer.CustomerID.Trim() == customerID.Trim()
}

Затем вы можете использовать:

from customer in context.Customers.Where(CustomerIdMatches(customerID))
... rest of query here

Или вы можете даже создать свой собственный метод расширения для выполнения части Where.

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

Использование будет выглядеть примерно так:

var query = context.Customers
                   .Where(TrimAndCompare(customer => customer.CustomerID,
                                         customer => customerID));

Не очень приятно: (

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