gpt4 book ai didi

linq - 如何提高 LINQ to EF 性能

转载 作者:行者123 更新时间:2023-12-03 07:20:11 25 4
gpt4 key购买 nike

我有两个类:Property 和 PropertyValue。一个属性有多个值,每个值都是一个新的修订版本。

检索一组属性时,我想包含每个属性值的最新修订版。

在 T-SQL 中,这可以非常有效地完成,如下所示:

SELECT 
p.Id,
pv1.StringValue,
pv1.Revision
FROM dbo.PropertyValues pv1
LEFT JOIN dbo.PropertyValues pv2 ON pv1.Property_Id = pv2.Property_Id AND pv1.Revision < pv2.Revision
JOIN dbo.Properties p ON p.Id = pv1.Property_Id
WHERE pv2.Id IS NULL
ORDER BY p.Id

此查询中的“魔法”是连接小于条件并查找没有 LEFT JOIN 强制结果的行。

如何使用 LINQ to EF 完成类似的任务?

我能想到的最好的办法是:

from pv in context.PropertyValues
group pv by pv.Property into g
select g.OrderByDescending(p => p.Revision).FirstOrDefault()

它确实产生了正确的结果,但比另一个慢大约 10 倍。

最佳答案

也许这会有所帮助。其中 db 是数据库上下文:

(
from pv1 in db.PropertyValues
from pv2 in db.PropertyValues.Where(a=>a.Property_Id==pv1.Property_Id && pv1.Revision<pv2.Revision).DefaultIfEmpty()
join p in db.Properties
on pv1.Property_Id equals p.Id
where pv2.Id==null
orderby p.Id
select new
{
p.Id,
pv1.StringValue,
pv1.Revision
}
);

关于linq - 如何提高 LINQ to EF 性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8555000/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com