Вопрос: Почему я не могу повторно использовать функцию в LINQ to SQL?


Почему приведенная ниже ссылка 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;

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

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

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


3


источник


Ответы:


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

_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));

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


8