在 linq 中按计数超时分组并获取前(n)条记录

Group and Get top(n) records by count times out in linq

我正在尝试使用 Linq 和 GroupBy 获取访问量最大的前 10 个组织。访问组织时,将使用以下 class 记录其信息。每天最多添加 1000 条记录。

public class LogOrgAccess
{
    public int OrganisationID { get; set; }
    public DateTime AccessDate { get; set; }

    [ForeignKey("OrganisationID")]
    public virtual Organisation Organisation { get; set; }

}

我的组织 class 看起来像:

 public partial class Organisation
 {

    public int OrganisationID { get; set; }
    public string OrgName { get; set; }
    public double Latitude { get; set; } 
    public double Longitude { get; set; }
 }

我想在一个时间范围内拉回前 (n) 个访问过的组织,所以我创建了一个 class 将结果映射到:

    public class OrgAccessDTO
    {
    public int OrganisationID { get; set; }
    public string OrgName { get; set; }

    public int Counter { get; set; }
    public double Longitude { get; set; }
    public double Latitude { get; set; }
    }

我已经编写了以下查询来尝试 return 所需的数据:

     public IQueryable<OrgAccessDTO> GetOrgAccessByDateRange(DateTime fromDate, DateTime toDate)
     {

        return _UoW.LogOrgAccess.All.Where(s => s.AccessDate >= fromDate && s.AccessDate <= toDate)
             .GroupBy(s => s.OrganisationID)
                    .Select(g => new OrgAccessDTO
                    {
                        OrganisationID = g.FirstOrDefault().OrganisationID,
                        OrgName = g.FirstOrDefault().Organisation.OrgName,
                        Latitude = g.FirstOrDefault().Organisation.Latitude,
                        Longitude = g.FirstOrDefault().Organisation.Longitude,
                        Counter = g.Count(),
                    }
              ).OrderByDescending(g=>g.Counter).Take(10);
    }

我正在 return 将 Iqueryable 发送到我的控制器:

IList<OrgAccessDTO> logs = _logService.GetOrgAccessByDateRange(start, end).ToList();

查询一直超时,出现异常 "Win32Exception: The wait operation timed out"。

我已经延长了我的连接超时 属性 但这似乎没有什么不同。

我认为查询本身可能存在问题,但是在向数据库中的 OrgAccess table 添加索引后,查询现在正在提取所需的数据。虽然还是有点慢。

开发机器上的 RAM 似乎也有问题。 (其 运行 满负荷运行)。当上传到网络服务器时,查询执行得更快。