【问题标题】:How can I speed this LINQ query up?如何加快此 LINQ 查询的速度?
【发布时间】:2013-06-10 18:53:39
【问题描述】:

我知道有一种更有效的方法可以做到这一点,使用谓词,但是相当新,我不确定如何去做..

List<HousingAssignment> list;

using (OEContext context = new OEContext())
{
    var query =
        from ha in context.HousingAssignments
        where ((ha.BedID == bed.ID) &&
                (((ha.CheckIn <= checkin) && (ha.CheckOut >= checkin)) ||
                ((ha.CheckIn <= checkout) && (ha.CheckOut >= checkout))))
        select ha;

    list = query.ToList();
}

return list.Count;

【问题讨论】:

  • 是什么让您认为where 表达式不是谓词?
  • 您的查询是一个带有 where 子句的简单选择语句,我非常怀疑编译器尚未完成任何可用的优化。
  • 这怎么太慢了?你分析过它吗?
  • @Arran 当你说 profiled 时,你的意思是 Debug->Start Performance Analysis 吗?这就是我目前所做的/知道该怎么做。
  • @Thomas Farley:非常正确,只是想提醒大家不要像许多开发人员那样花太多时间担心性能问题。

标签: c# asp.net performance linq entity-framework


【解决方案1】:

由于您只是返回计数,您可以在查询中使用Count 方法计算它:

using (OEContext context = new OEContext())
{
  var query =
    from ha in context.HousingAssignments
    where ((ha.BedID == bed.ID) &&
            (((ha.CheckIn <= checkin) && (ha.CheckOut >= checkin)) ||
            ((ha.CheckIn <= checkout) && (ha.CheckOut >= checkout))))
    select ha;

  return query.Count();  
}

这消除了从本地数据库中提取值、存储到列表中然后“丢弃”结果的过程。相反,计数将在服务器上计算,而您只会提取一个数字。

您还可以通过对 CheckInCheckOut 列的正确索引来加速服务器上的查询。

【讨论】:

  • 您可能还需要为数据库中的 CheckIn 和 CheckOut 字段添加索引。
  • @TimB 也将其添加到答案中。
  • 这就是我所说的..我不需要数据,只需要与查询匹配的记录数..我想我只是被自己绊倒了..谢谢:)这么简单..
  • @Glendale 如果您只需要计数而不是数据(这是您的代码显示的),这将是一个巨大的改进
猜你喜欢
  • 1970-01-01
  • 2014-10-04
  • 1970-01-01
  • 2014-05-29
  • 2012-10-26
  • 2015-04-07
  • 1970-01-01
  • 2022-01-19
相关资源
最近更新 更多