为什么下面的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 statment函数抛出异常 但下面没有为什么??
var customers = from customer in _context.Customers
where
customer.CustomerID.Trim() == customerID.Trim()
select customer;
我收到'System.NotSupportedException' 我尝试访问客户的地方
答案 0 :(得分:8)
在第二个片段中,逻辑被翻译成lambda表达式,然后编译成表达式树......两个查询翻译是:
_context.Customers
.Where(customer => TrimAndCompare(customer.CustomerID, customerID);
VS
_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));
非常不错:(