为了获得更好的性能,它是否优于IQueryable或DLinq而不是IEnumerable?

时间:2013-08-16 09:10:40

标签: c# dynamic-linq

如果我对抗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'?但是,作为一般规则,“可以作为智慧”吗?我知道如果你正在运行标准迭代,它会在'as IEnumerable'和'as IQueryable'之间获得相同的结果。

但是它只是在where语句中的摘要函数和委托表达式会有区别 - 或者如果你使用'as IQueryable',你通常会获得更好的性能吗? (对于DLinq实体的标准迭代和过滤函数)

谢谢!

1 个答案:

答案 0 :(得分:1)

那么,取决于你想做什么...... 将它作为IEnumerable转换将返回一个你可以枚举的对象......仅此而已。 所以是的,如果你在IEnumerable上调用Count,那么你枚举列表(所以你实际执行你的Select查询)并计算每次迭代。

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

在可枚举上调用OrderBy浏览所有结果并在内存中对它们进行排序。在可查询上调用OrderBy只是在SQL的末尾添加ORDER BY并让数据库进行排序。

一般来说,最好将它保持为IQueryable,是的...除非你想通过实际浏览它们来计算它们(而不是做一个SELECT COUNT(*)...)