我有两个类: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/