C# DLinq优于IQueryable还是DLinq优于IEnumerable以获得更好的性能?

C# DLinq优于IQueryable还是DLinq优于IEnumerable以获得更好的性能?,c#,dynamic-linq,C#,Dynamic Linq,例如,如果我运行dlinq var custq = data.StoreDBHelper.DataContext.Customers as IEnumerable <Data.SO.Customer>; var custq=data.StoreDBHelper.DataContext.Customers作为IEnumerable; 我认为这与跑步没有多大区别: var custq = data.StoreDBHelper.DataContext.Customers as IQue

例如,如果我运行dlinq

var custq = data.StoreDBHelper.DataContext.Customers as IEnumerable <Data.SO.Customer>;
var custq=data.StoreDBHelper.DataContext.Customers作为IEnumerable;
我认为这与跑步没有多大区别:

var custq = data.StoreDBHelper.DataContext.Customers as IQueryable <Data.SO.Customer>;
var custq=data.StoreDBHelper.DataContext.Customers作为IQueryable;
作为,IQueryable继承自IEnumerable

但如果你打电话给我,我发现了以下几点: 客户总数() 然后,如果您使用'as IEnumerable',程序将按您调用的方式处理这个问题 因为程序上的内存提升到了相同的级别,当我尝试时,custq.ToList.Sum() 但不在“as IQueryable”上(因为该问题当时在sql server上运行),并且不影响程序的内存使用

我的问题很简单,你不应该在Dlinq上使用'as IEnumerable'吗?但是作为一个普遍的规则是“像我一样”吗?我知道,如果您运行的是标准迭代,它会得到相同的结果,介于“as IEnumerable”和“as IQueryable”之间

但是,where语句中的摘要函数和委托表达式会有区别吗?或者,如果使用“as IQueryable”,总体上会获得更好的性能吗?(用于DLinq实体上的标准迭代和过滤函数)


谢谢

嗯,这取决于你想做什么。。。 将其转换为IEnumerable将返回一个可以枚举的对象。。。没别的了。 因此,是的,如果您对IEnumerable调用Count,那么您将枚举列表(这样您就可以实际执行Select查询)并对每个迭代进行计数

另一方面,如果保留IQueryable,则可以枚举它,但也可以执行WARE、OrderBy或count等数据库操作。然后,这将延迟查询的执行,并最终在运行查询之前对其进行修改

在可枚举对象上调用OrderBy浏览所有结果并在内存中对其排序。对可查询项调用OrderBy只需在SQL末尾添加OrderBy,并让数据库进行排序


总的来说,最好把它作为一个易货,是的。。。除非你想通过实际浏览来计算它们(而不是进行选择计数(*)…)

那么,这取决于你想做什么。。。 将其转换为IEnumerable将返回一个可以枚举的对象。。。没别的了。 因此,是的,如果您对IEnumerable调用Count,那么您将枚举列表(这样您就可以实际执行Select查询)并对每个迭代进行计数

另一方面,如果保留IQueryable,则可以枚举它,但也可以执行WARE、OrderBy或count等数据库操作。然后,这将延迟查询的执行,并最终在运行查询之前对其进行修改

在可枚举对象上调用OrderBy浏览所有结果并在内存中对其排序。对可查询项调用OrderBy只需在SQL末尾添加OrderBy,并让数据库进行排序


总的来说,最好把它作为一个易货,是的。。。除非您想通过实际浏览它们来计算它们(而不是进行选择计数(*)…)

dlinq,IQueryable和IEnumerable是三件不同的事情。需要明确的是,您是否关心内存使用的性能?技术上,动态Linq是一个构建在
IQueryable
界面之上的库
IQueryable
IEnumerable
虽然在技术上是连接的,但通常意味着完全不同的事情。动态Linq,通过
AsQueryable
甚至可以在
IEnumerable
之上使用(参见Gravell的),但我从未对
AsQueryable
的使用进行过基准测试,我个人认为它(AsQueryable)本身几乎是一个无用的黑客,这只是一个理论实验。谢谢你提供的信息。我知道这一点。我想了解使用时发动机罩下会发生什么。过滤器。位置和。选择。等等-是的-Rikalous,我希望客户端应用程序有最好的性能,所以服务器来完成工作。@Niklas不,你的问题表明你不知道这一点。标题是
IQueryable on Dlinq以获得最佳性能?
就好像IQueryable是在Dlinq之上构建的(相反……),你应该问:是Dlinq优于IQueryable还是Dlinq优于IEnumerable以获得更好的性能),而在问题中,你的两个例子提到了
IQueryable
IEnumerable
(没有第三个例子使用DLinq)DLinq,IQueryable和IEnumerable是三种不同的东西。需要澄清的是,您是否关心内存使用中的性能?技术上,动态Linq是一个构建在
IQueryable
界面之上的库
IQueryable
IEnumerable
虽然在技术上是连接的,但通常意味着完全不同的事情。动态Linq,通过
AsQueryable
甚至可以在
IEnumerable
之上使用(参见Gravell的),但我从未对
AsQueryable
的使用进行过基准测试,我个人认为它(AsQueryable)本身几乎是一个无用的黑客,这只是一个理论实验。谢谢你提供的信息。我知道这一点。我想了解使用时发动机罩下会发生什么。过滤器。位置和。选择。等等-是的-Rikalous,我希望客户端应用程序有最好的性能,所以服务器来完成工作。@Niklas不,你的问题表明你不知道这一点。标题是
IQueryable on Dlinq以获得最佳性能?
就好像IQueryable是在Dlinq之上构建的(相反……),你应该问:是Dlinq优于IQueryable还是Dlinq优于IEnumerable以获得更好的性能),在这个问题中,你的两个例子提到了
IQueryable
IEnumerable
(并且没有第三个例子使用DLinq)如果我想使用IEnumerable,那么使用ToList()不是更好吗?它似乎更快一些?使用ToList实际上会执行一次SQL查询,从而减少列表中的数据。所以,它更快,因为你