【发布时间】:2012-10-22 15:11:00
【问题描述】:
我正在尝试优化以下 LINQ 查询以提高其速度性能。它正在搜索的对象数量可能达到数万。
var lQuery = from o in oEvents
where (o.oSalesEvent != null && o.oSalesEvent.OccurDate < oCalcMgr.OccurDate && (
(oCalcMgr.InclTransTypes == Definitions.TransactionTypes.SalesAll) ?
(o.oSalesEvent.EventStateID == ApprovedID || o.oSalesEvent.EventStateID == PendingID) :
o.oSalesEvent.EventStateID == ApprovedID)) &&
((oCalcMgr.InclTransTypes == Definitions.TransactionTypes.SalesAll) ?
(o.oSalesMan.oEmployment.EventStateID == ApprovedID || o.oSalesMan.oEmployment.EventStateID == PendingID) :
o.oSalesMan.oEmployment.EventStateID == ApprovedID)
select new { SaleAmount = o.SaleAmount.GetValueOrDefault(), CompanyID = o.oSalesEvent.CompanyID };
查询基本上是说,给我某个日期之前发生的所有销售事件的销售额和公司 ID。销售活动的状态和推销员的就业状态应始终为“已批准”,或者如果指定,它们也可以为“待定”。
如您所见,有一个日期比较和几个整数比较。使用哪个整数比较取决于属性是否匹配某个 Enum 值。
我对如何进行优化有一些自己的想法,但我想听听其他人的想法,他们可能对 LINQ 如何在幕后翻译此查询有更深入的了解。
谢谢
【问题讨论】:
-
在使某些东西变得更快之前,您需要首先了解为什么它现在还不够快。我在您的问题中没有看到任何类型的性能分析,因此无法回答这个问题。关于这个查询需要修复的慢是什么?如果你不能回答,那你怎么知道有没有更快的答案?
-
看起来
where子句的后半部分独立于o,因此可以从查询中删除。 -
没错。
ied是什么?真的,你名字里的os 是怎么回事? -
我不会优化性能,而是从优化可读性开始。创建封装复杂性的方法以避免这种可怕的查询。第一眼没人会明白你在做什么。
-
您可能希望调整 SO 上的用户 的可读性,因此我们可能更愿意回答您的问题。好处是之后您将拥有更多可读的源代码,供您和需要维护它的任何人使用。
标签: c# .net performance linq optimization