Во втором фрагменте логика переводится в лямбда-выражение, которое затем компилируется в дерево выражений ... два перевода запроса:
_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));
Не очень приятно: (