【发布时间】:2015-03-13 12:41:07
【问题描述】:
我有一个 linq 查询,它根据页面点击量表返回用户查看的最后一页。这些字段只是从用户活动记录的TimeStamp、UserID 和URL。查询如下所示:
public static IQueryable GetUserStatus()
{
var ctx = new AppEntities();
var currentPageHits = ctx.Pagehits
.GroupBy(x => x.UserID)
.Select(x => x.Where(y => y.TimeStamp == x.Max(z => z.TimeStamp)))
.SelectMany(x => x);
return currentPageHits.OrderByDescending(o => o.TimeStamp);
}
查询运行良好,但运行缓慢。我们的 DBA 向我们保证,该表在所有正确的位置都有索引,问题一定出在查询上。
这有什么本质上的错误或坏处,还是有更有效的方法来获得相同的结果?
【问题讨论】:
-
这似乎是一个非常简单的查询...我认为它不能优化很多。
-
如果我错了,请纠正我,但 PLINQ(并行 LINQ)在这里不是一个可行的选择吗? msdn.microsoft.com/en-us/library/dd460688%28v=vs.110%29.aspx
-
您应该记录查询生成的 SQL 并对其进行分析以确保其有效。
-
@GrawCube 他使用的是Entity Framework或LINQ to SQL,所以分组实际上是在DB中完成的。当您有多个可以并行化的工作单元时,PLINQ 会有所帮助。
-
如 w0lf 所说。最终的
OrderByDescending最多可以在 C# 端完成,但 PLINQ 在这里无济于事。
标签: c# linq-to-sql