在子查询中使用FirstOrDefault



我们的一些LINQ to SQL查询存在重大性能问题。

我们有一个案例表,在CaseStatus上有一对多关系(关系表是CaseCaseStatus(虽然,我们想跟踪一个案例中的所有雕像,但只有最后一个真正有价值。

我们正在构建如下查询:

IQueryable<Case> results = Repository.GetFullList(); // Returns a Queryable
if(filter.OnlyOpen){
results = results
.Where(c => c.CaseCaseStatusses.Any() 
&& c.CaseCaseStatusses.OrderByDescending(cs => cs.Timestamp).FirstOrDefault().Status.IsClosed != true);
}
results.Select(x => Dto(x)).ToList();

基本上我们想知道最后一个状态,是否有一个属性"IsClosed==true";。

当我通过SQL探查器监视我的数据库时,我可以看到当我们点击Select语句时,而不是之前,数据库正在被查询。(如预期(但是,在执行查询时,我可以看到针对每种情况的选择查询:

SELECT [cs0].[Id], [cs0].[CaseId], [cs0].[Note], [cs0].[ShowOnClientPage], [cs0].[StatusId], [cs0].[TimestampUTC], [cs.Status0].[IsClosed] 
FROM [CaseCaseStatusses] AS [cs0] 
INNER JOIN [CaseStatusses] AS [cs.Status0] ON [cs0].[StatusId] = [cs.Status0].[Id]
WHERE [cs0].[CaseId] = <CaseId>

由于我们的案例表中有8000多条记录,它完成了8000条以上的精选语句。。。而我们希望执行一个单独的查询。EFCore中的这种行为发生了变化吗?我可以发誓我以前做过,它会输出一个查询(当然,这是一个不可读的大查询,而不是EFCore(

是否有其他(更好的(方法来执行此类查询?

试试这个查询,它应该可以与任何EF版本一起使用。

var results = 
from r in results
from c in r.CaseCaseStatusses
.OrderByDescending(cs => cs.Timestamp)
.Take(1)
where c != null && c.Status.IsClosed != true
select r;

最新更新