在 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 似乎也有问题。 (其 运行 满负荷运行)。当上传到网络服务器时,查询执行得更快。
我正在尝试使用 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 似乎也有问题。 (其 运行 满负荷运行)。当上传到网络服务器时,查询执行得更快。