获取COUNT时,Linq Select Statement变慢

时间:2011-06-17 00:02:36

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

我试图通过以下方法使用EntityFramework和Linq获得总记录数。返回计数很慢。

public static int totalTracking(int id)
{
   using (var ctx = new GPEntities())
   {
      var tr = ctx.Tracking
                   .Where(c => c.clientID == Config.ClientID)
                   .Where(c => c.custID == id)
                   .Where(c => c.oOrderNum.HasValue)
                  .ToList();
      return tr.Count();
   }        
}

3 个答案:

答案 0 :(得分:10)

您可以显着简化查询:

using (var ctx = new GPEntities())
{
    return ctx.Tracking
        .Where(c => c.clientID == Config.ClientID)
        .Where(c => c.custID == id)
        .Where(c => c.oOrderNum.HasValue)
        .Count();
}

当您调用ToList时,这将触发实现,因此将向数据库发出查询,并将检索所有列。实际计数将在客户端进行。

如果您只是Count,而没有ToList,则会在您拨打Count时发出查询,而服务器只返回一个号码,而不是表格。

这对性能并不重要,但我认为如果没有那么多Where,代码看起来会有点好看:

using (var ctx = new GPEntities())
{
    return ctx.Tracking
        .Where(c => 
            c.clientID == Config.ClientID &&
            c.custID == id &&
            c.oOrderNum.HasValue)
        .Count();
}

甚至

using (var ctx = new GPEntities())
{
    return ctx.Tracking
        .Count(c => 
            c.clientID == Config.ClientID &&
            c.custID == id &&
            c.oOrderNum.HasValue);
}

答案 1 :(得分:3)

您可以非常简化,只需使用Count Extension method

即可

你试过了吗?

public static int totalTracking(int id)
{
    using (var ctx = new GPEntities())
    {
        return ctx.Tracking.Count(
                  c => c.clientID == Config.ClientID &&
                       c.custID == id &&
                       c.oOrderNum.HasValue);
    }        
}

答案 2 :(得分:2)

移除电话.ToList()。它强制查询将整个结果拉到客户端。

通过删除它,并直接在tr的结果上调用.Count()(没有ToList()),Count()成为查询本身的一部分,并远程执行,这将大大简化这样:

public static int totalTracking(int id)
{
    using (var ctx = new GPEntities())
    {
        var tr = ctx.Tracking
            .Where(c => c.clientID == Config.ClientID)
            .Where(c => c.custID == id)
            .Where(c => c.oOrderNum.HasValue);

        // This can be added above, or left here - the end result is the same
        return tr.Count();
    }        
}