使用count()优化linq查询

时间:2015-04-14 10:06:48

标签: c# asp.net sql-server linq

我有以下查询可以正常使用

var myList = (from p in db.full


                      group p by p.object into g
                      orderby g.Count() descending
                      select new StringIntType
                      {
                          str = g.Key,

                          nbr = g.Count()
                      }).Take(50).ToList();

问题在于它有点慢,因为我使用的是count(),它被转换为count(*)。
我需要知道是否有办法使用count(object),

这是我在sql server profiler中得到的内容

  exec sp_executesql N'SELECT TOP (50) 
  [Project1].[C2] AS [C1], 
  [Project1].[object] AS [object], 
  [Project1].[C1] AS [C2]
  FROM ( SELECT 
      [GroupBy1].[A1] AS [C1], 
    [GroupBy1].[K1] AS [object], 
    1 AS [C2]
    FROM ( SELECT 
        [Extent1].[object], AS [K1], 
        COUNT(1) AS [A1]
        FROM (SELECT 
[full].[mc_host_class] AS [mc_host_class], 
[full].[event_handle] AS [event_handle], 
[full].[mc_host_address] AS [mc_host_address], 
[full].[mc_object_class] AS [mc_object_class], 
[full].[mc_object] AS [mc_object], 
[full].[mc_incident_time] AS [mc_incident_time], 
[full].[date_reception] AS [date_reception], 
[full].[status] AS [status], 
[full].[mc_owner] AS [mc_owner], 
[full].[msg] AS [msg], 
[full].[duration] AS [duration], 
[full].[repeat_count] AS [repeat_count], 
[full].[mc_date_modification] AS [mc_date_modification], 
[full].[event_class] AS [event_class], 
[full].[bycn_ticket_remedy] AS [bycn_ticket_remedy], 
[full].[mc_host] AS [mc_host], 
[full].[acknowledge_by] AS [acknowledge_by], 
[full].[acknowledge_by_time] AS [acknowledge_by_time], 
[full].[assigned_by] AS [assigned_by], 
[full].[assigned_to] AS [assigned_to], 
[full].[assigned_by_time] AS [assigned_by_time], 
[full].[closed_b            y] AS [closed_by], 
[full].[closed_by_time] AS [closed_by_time], 
[full].[blacked_out] AS [blacked_out], 
[full].[bycn_liaison_type] AS [bycn_liaison_type], 
[full].[bycn_liaison_debit] AS [bycn_liaison_debit], 
[full].[cause] AS [cause], 
[full].[mc_location] AS [mc_location], 
[full].[mc_parameter] AS [mc_parameter]
FROM [dbo].[full] AS [full]) AS [Extent1]
        GROUP BY [Extent1].[object], 
        )  AS [GroupBy1]
     )  AS [Project1]
ORDER BY [Project1].[C1] DESC',N'@p__linq__0 datetime2(7),@p__linq__1 datetime2(7)',@p__linq__0='2015-03-14 00:00:00',@p__linq__1='2015-04-15 00:00:00'

1 个答案:

答案 0 :(得分:2)

也许情侣优化可以解决问题:

  • 在选择
  • 之前先做好
  • 使用let关键字
  • 仅对组进行一次计数

所以元代码(这个代码写在记事本中,不会编译!)

var topFifty = (
    from p in db.full   
    group p by p.object into g
    let groupedCount = g.Count()
    orderby groupedCount descending 
    select p.key, groupedCount
    )
    .Take(50).ToList();

var topFifty.Select(x => new StringIntType
    {
        str = x.Key,
        nbr = x.Count
    }).ToList();