如何解决LinQ与CROSS APPLY和ORDER BY
如果我想显示一个主要元素以及第一个基础元素中的信息,那么CROSS APPLY似乎是SQL中性能最高的解决方案。
但是,当我编写此LinQ查询时:
from mm in a
from qcr in b
.Where(x => x.MasterID == mm.MasterID)
.OrderByDescending(x => x.Priority)
.Take(1)
select new
{
mm.MasterID,mm.ColumnA,mm.ColumnB,mm.ColumnC,qcr.ColumnD,qcr.ColumnE,qcr.ColumnF,};
结果查询如下:
FROM a AS [t0]
CROSS APPLY (
SELECT TOP (1) [t1].[ColumnD],[t1].[ColumnE],[t1].[ColumnF],[t1].[Priority]
FROM b AS [t1]
WHERE [t1].[MasterID] = ([t0].[MasterID])
ORDER BY [t1].[Priority] DESC
) AS [t2]
ORDER BY [t2].[Priority] DESC
问题是第二个试图按优先级对主要结果进行排序的ORDER BY,这会导致严重的性能问题(如果我在SQL中手动删除ORDER BY,整个查询的速度将提高10倍)。
我已经尝试通过再次调用OrderByDescending覆盖排序,但是它仅将列添加到Priority列中,而不是将其从排序中删除,并且不会提高性能。
是否可以在LinQ中编写CROSS APPLY,而无需尝试按CROSS APPLY的内部选择中的排序列对所有内容进行排序?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。