1

我正在尝试优化以下 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 如何在幕后翻译这个查询有更深入的了解。

谢谢

4

2 回答 2

0

这既可以提高可读性,也可以加快速度,但试试看:

var lQueryTemp = from o in oEvents
where (o.oSalesEvent != null && o.oSalesEvent.OccurDate < oCalcMgr.OccurDate)

if (oCalcMgr.InclTransTypes == Definitions.TransactionTypes.SalesAll)
{
  lQueryTemp = from o in lQueryTemp
        where (o.oSalesEvent.EventStateID == ApprovedID || o.oSalesEvent.EventStateID == PendingID) &&
      (o.oSalesMan.oEmployment.EventStateID == ApprovedID || o.oSalesMan.oEmployment.EventStateID == PendingID);
}
else
{
  lQueryTemp = from o in lQueryTemp
        where (o.oSalesEvent.EventStateID == ApprovedID &&  o.oSalesMan.oEmployment.EventStateID == ApprovedID);
}

var lQuery = from o in lQueryTemp
select new { SaleAmount = o.SaleAmount.GetValueOrDefault(), CompanyID = o.oSalesEvent.CompanyID };

这可能会通过取消对 的两个检查来加快速度oCalcMgr.InclTransTypes,这对于此查询而言实际上是一个常数。

于 2012-10-22T15:57:15.877 回答
0

在我看来,您最大的挑战是您在 Linq 语句中执行多个条件检查,这将花费大量时间。在 oEvents 中创建一个新属性怎么样 - 说“IsEligable”并在其他变量的 Set 语句中设置它的值(比在 Linq 中不断重新查询每个变量快得多)。

然后,当您到达这部分代码时,您可以将 Linq 更新为以下内容:

var lQuery = from o in oEvents
where (o.oSalesEvent != null && o.oSalesEvent.OccurDate < oCalcMgr.OccurDate && o.IsEligable == True)
select new { SaleAmount = o.SaleAmount.GetValueOrDefault(), CompanyID = o.oSalesEvent.CompanyID };

...我猜这会加快执行速度,但只是一个想法...

于 2012-10-22T15:49:43.533 回答