C# 如何在Linq中调用本地方法来查询实体?

C# 如何在Linq中调用本地方法来查询实体?,c#,.net,linq,entity-framework,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); public void salescont(字符串customerId) { ..

我有以下代码:

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

var resultQuery = dataContext.Customers
.Where (c => c.Name == "Alugili")
.Where (c => SalesCount(c.CustomerId) < 100);
public void salescont(字符串customerId)
{
..
..
返回。。。;
}
var resultQuery=dataContext.Customers
其中(c=>c.Name==“Alugili”)
.式中(c=>SalesCount(c.CustomerId)<100);
当我执行resultQuery时,我得到一个转换为SQL异常的结果

我需要在中的中调用SalesCount我可以在哪里执行该操作?是否有解决此问题的方法

试试看

var resultQuery = dataContext.Customers
.Where (c => c.Name == "Alugili")
.ToArray()
.Where (c => SalesCount(c.CustomerId) < 100);
var resultQuery=dataContext.Customers
其中(c=>c.Name==“Alugili”)
.ToArray()
.式中(c=>SalesCount(c.CustomerId)<100);
但是第二个
,其中
不是作为SQL运行的,而是本地运行的-所有名为“Alugili”的客户都从数据库中取出


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

你不能。您不能直接在SQL server上执行C#代码,您只能使用
表达式和一些特殊的可识别函数

除非将LINQ中的查询(至少部分)转换为对象

var resultQuery = dataContext.Customers
    .Where (c => c.Name == "Alugili")
    .AsEnumerable()
    .Where (c => SalesCount(c.CustomerId) < 100);
var resultQuery=dataContext.Customers
其中(c=>c.Name==“Alugili”)
.可计算的()
.式中(c=>SalesCount(c.CustomerId)<100);
请注意,最后一个
,其中的
将在客户端执行,因此会从数据库中提取许多无用的行。

是的,您可以

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

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


var resultQuery = dataContext.Customers.AsEnumerable()
                 .Where (c => c.Name == "Alugili" && SalesCount(c.CustomerId) < 100);
public**int**salescont(字符串customerId)
{
..
..
返回500;
}
var resultQuery=dataContext.Customers.AsEnumerable()
其中(c=>c.Name==“Alugili”&&SalesCount(c.CustomerId)<100);

在两个where条件之间添加&&它将工作

它正在工作,非常感谢。您能告诉我是否将从数据库中加载所有实体?我有一个懒惰的加载我不需要加载他们所有这是可能的还是不可能的?看看这个:。也许这解决了你的问题。你必须明白@xanatos也做了同样的事情。它也在发挥作用。否,它将加载所有在
c=>c.Name=“Alugili”
中幸存的实体。。在更广泛的情况下,可能会有很多记录,但可能不是所有记录……头中是Linq2SQL,标记中是EF。真相在哪里?:)Linq2SQL和EF是相似但完全不同的技术。我想,你在某个地方感到困惑。当面对这样的情况时,你会问自己:
salescont
在T-SQL中所做的任何事情都可以实现吗?如果是这样,请尝试创建一个表示
客户
表的视图,但添加一个额外的列(SalesCount的结果
)。然后将LINQ中的视图映射到SQL实体,并对该实体执行选择。通过这种方式,您可以避免在.NET中处理大量记录,并让RDBMS为您处理。可能非常值得一读,您可以制作CLR UDF并在linq中调用它。在下面提到的情况下,当使用ToArray、AsEnumerable等时,您将获得内存加载。+1用于使用
AsEnumerable()
这可以防止在扩展“内存查询”时不必要地加载内存。ToList和ToArray直接加载数据,但AsEnumerable不加载数据。我将对其进行测试并给您反馈,非常感谢!在这种情况下,
ToList
ToArray
AsEnumerable
从记忆加载的角度来看是类似的。关键字是
物化查询
@HamletHakobyan你有关于这个的链接或有用的信息吗?我认为这是最合理的解决方法,因为实体加载到内存中EF不支持这个函数,现在我将使用它,有时间我可以扩展动态库我将发布延伸。谢谢!不,你不能。RDBMS是实际执行查询的数据库。在这个场景中,LINQ代码只是一个编排器,SQL查询是基于它编写、发送到数据库并在那里执行的。如果为真,则对随机LINQ查询执行.Count()将导致整个表通过TCP连接传输到.NET,并检查每一行是否符合用户程序员的想法,只是为了计算一个计数。@EduardDumitru我的代码只是将linq2sql转换为Linq2Objective如果您注意询问用户编写的内容,您会注意到代码行
var resultQuery=dataContext.Customers
。假设他不是有意欺骗我们,他很可能使用LINQtoSQL,我们也可以假设他是在用SQLServer做所有这些。照你说的去做代价很高。DB可以执行的所有where子句都应该放在调用
.AsEnumerable()
之前。此外:答案是不,不,你不能,但是你可以把所有的东西都带进.NET,并造成大量的资源消耗