如何在Linq to Entities查询中调用本地方法?

时间:2013-09-10 09:08:56

标签: c# .net linq entity-framework

我有以下代码:

public void SalesCount(string customerId)
{
  ..
  ..
  return ...;
}

var resultQuery = dataContext.Customers
.Where (c => c.Name == "Alugili")
.Where (c => SalesCount(c.CustomerId) < 100);

当我执行resultQuery时,我得到了SQL异常的翻译。

我需要在其中中调用 SalesCount ,我是否可以解决此问题?

4 个答案:

答案 0 :(得分:12)

简单地说,你不能。您不能直接在SQL服务器上执行C#代码,只能使用Expressions和一些特殊识别的函数...

除非您在LINQ-to-Objects ...

中转换查询(至少部分)
var resultQuery = dataContext.Customers
    .Where (c => c.Name == "Alugili")
    .AsEnumerable()
    .Where (c => SalesCount(c.CustomerId) < 100);

请注意,最后一个Where将在客户端执行,因此将从数据库中提取许多无用的行。

答案 1 :(得分:2)

尝试

var resultQuery = dataContext.Customers
.Where (c => c.Name == "Alugili")
.ToArray()
.Where (c => SalesCount(c.CustomerId) < 100);

但是第二个Where不是作为SQL运行而是在本地运行 - 所有名为“Alugili”的客户都从数据库中提取......

否则,您必须直接在where方法中将您的方法写为lambda表达式。

答案 2 :(得分:0)

添加&amp;&amp;在两个条件之间......它会起作用

答案 3 :(得分:-2)

是的,你可以。

但您应该更改函数的返回类型:

public **int** SalesCount(string customerId)
{
  ..
  ..
  return 500;
}


var resultQuery = dataContext.Customers.AsEnumerable()
                 .Where (c => c.Name == "Alugili" && SalesCount(c.CustomerId) < 100);