为什么我不能在LINQ to SQL中重用一个函数

时间:2010-01-21 07:37:23

标签: c# .net 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;

上面的LINQ to SQL statment函数抛出异常 但下面没有为什么??

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

我收到'System.NotSupportedException' 我尝试访问客户的地方

1 个答案:

答案 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));

非常不错:(