C# 如何加快LINQ查询的速度?

C# 如何加快LINQ查询的速度?,c#,asp.net,performance,linq,entity-framework,C#,Asp.net,Performance,Linq,Entity Framework,我知道有一种更有效的方法可以做到这一点,即使用谓词,但由于它是一种全新的方法,我不知道该怎么做 List<HousingAssignment> list; using (OEContext context = new OEContext()) { var query = from ha in context.HousingAssignments where ((ha.BedID == bed.ID) &&

我知道有一种更有效的方法可以做到这一点,即使用谓词,但由于它是一种全新的方法,我不知道该怎么做

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子句的简单select语句,我非常怀疑编译器还没有进行任何优化。这怎么会太慢呢?你分析过吗?@Arran当你说profiled时,是指Debug->Start Performance Analysis吗?这就是我现在所做的一切。@Thomas Farley:没错,只是想提醒大家不要像许多开发人员那样花太多时间担心性能。是什么让你认为where表达式不是谓词?你的查询是一个带有where子句的简单select语句,我非常怀疑编译器还没有进行任何优化。这怎么会太慢呢?你分析过吗?@Arran当你说profiled时,是指Debug->Start Performance Analysis吗?这就是我现在所做的一切。@Thomas Farley:没错,只是想提醒大家不要像许多开发人员那样花太多时间担心性能。你可能还需要在数据库的签入和签出字段中添加索引。@TimB也在答案中添加了这一点。这就是我所说的。。我不需要数据,只需要匹配查询的记录数。。我想我只是被自己绊倒了。。谢谢:很简单。@Glendale如果您只需要计数,而不是代码显示的数据,这将是一个巨大的改进。您可能还需要向数据库中的签入和签出字段添加索引。@TimB也将此添加到了答案中。这就是我所说的。。我不需要数据,只需要匹配查询的记录数。。我想我只是被自己绊倒了。。谢谢:很简单。@Glendale如果您只需要计数,而不是代码显示的数据,这将是一个巨大的改进
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();  
}