C# 在子属性上使用OrderByDescending时,LINQ查询速度较慢
我将以上内容作为IQueryable返回,但当我运行C# 在子属性上使用OrderByDescending时,LINQ查询速度较慢,c#,sql-server,linq,C#,Sql Server,Linq,我将以上内容作为IQueryable返回,但当我运行allUsers.Count()时大约需要5秒钟,应该是即时的。有~2000个用户记录 LINQ是否在做一些低效的事情,比如为每个用户运行单独的查询来计算第一个UserStatusHistory记录 var allUsers = GetAllUsers() .Where(x => x.UserStatusHistory .OrderByDescending(y => y.Created) .First().Status
allUsers.Count()时代码>大约需要5秒钟,应该是即时的。有~2000个用户记录
LINQ是否在做一些低效的事情,比如为每个用户运行单独的查询来计算第一个UserStatusHistory记录
var allUsers = GetAllUsers()
.Where(x => x.UserStatusHistory
.OrderByDescending(y => y.Created)
.First().StatusId == (int) UserStatusEnum.Enabled);
编辑以回答问题:
GetAllUsers()返回一个IQueryable
正在使用EF Core 1.1.1。
GetAllUsers返回什么?所有用户的列表
?要了解问题,您应该查看EF生成的sql。将数据库日志重定向到输出窗口,您可以看到sql server执行的所有查询。不确定sql如何转换,但您正在对UserStatusHistory排序。这可能会为每个用户记录创建一个嵌套的select查询,这将解释性能问题。在这一点上,我只是在猜测,但这是我首先要看的地方。我建议你试着用一个joinWell得出同样的结果,第一个可能是一个问题,试着用single代替,这个问题确实缺乏上下文。查询提供程序以不同的方式处理LINQ查询。您需要指定使用的ORM,例如EF6、EF核心(+版本)等。
edit to answer questions:
GetAllUsers() returns an IQueryable<User>
EF Core 1.1.1 is being used.