【发布时间】:2013-08-16 17:51:59
【问题描述】:
例如,如果我与 dlinq 对抗
var custq = data.StoreDBHelper.DataContext.Customers as IEnumerable <Data.SO.Customer>;
我认为这与跑步没有太大区别:
var custq = data.StoreDBHelper.DataContext.Customers as IQueryable <Data.SO.Customer>;
因为,IQueryable 继承自 IEnumerable。
但是,如果您致电,我发现了以下内容: custq.Sum() 然后程序将在您调用 .toList() 时处理它,您使用“as IEnumerable” 因为程序上的内存提高到了相同的水平,所以当我尝试时,custq.ToList.Sum() 但不在'as IQueryable'上(因为问题随后在sql server上运行)并且不影响程序的内存使用。
我的问题很简单,你不应该在 Dlinq 上使用“as IEnumerable”吗?但是“作为 IQueryable”作为一般规则?我知道,如果您正在运行标准迭代,它会在“as IEnumerable”和“as IQueryable”之间得到相同的结果。
但仅仅是 where 语句中的汇总函数和委托表达式会有所不同 - 还是如果您使用“as IQueryable”,您通常会获得更好的性能? (用于 DLinq 实体上的标准迭代和过滤函数)
谢谢!
【问题讨论】:
-
dlinq、IQueryable 和 IEnumerable 是三个不同的东西。
-
澄清一下 - 您是否关心内存使用方面的性能?
-
Technically Dynamic Linq 是一个建立在
IQueryableinterface 之上的库。IQueryable和IEnumerable虽然在技术上连接通常意味着完全不同的东西。 Dynamic Linq,通过AsQueryable甚至可以在IEnumerable之上使用(参见Gravell 的response),但我从未对AsQueryable的使用进行基准测试,个人认为它(AsQueryable)是本身几乎无用的破解,仅作为理论实验有用。 -
xanatos - 感谢您提供信息。我知道这个。我想了解使用时在引擎盖下会发生什么。过滤 .where 和 .select。等等 - 是的 - Rikalous,我想要客户端应用程序的最佳性能,所以服务器完成工作。
-
@Niklas 不,您的问题表明您不知道这一点。标题是
IQueryable on Dlinq for best performance?,好像 IQueryable 是建立在 DLinq 之上的(而它恰恰相反......)你应该问:是 DLinq 优于 IQueryable 还是 DLinq 优于 IEnumerable 以获得更好的性能),而在问题中你有两个例子提到了IQueryable和IEnumerable(没有第三个使用DLinq 的例子)
标签: c# dynamic-linq