linq - 如何提高 LINQ to EF 性能

标签 linq t-sql entity-framework

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

相关文章:

c# - 如何使用 C# LINQ 在分组结果中选择所需的行

linq - Linq的大于条件加盟

SQL - 聚合可能不会出现在 UPDATE 语句的集合列表中

sql - 如果数字为 0.00,如何显示文本值 'X'。 SQL Server、存储过程

c# - 集成测试共享数据库的多个 Entity Framework dbcontexts

c# - LINQ 首先选择

c# - .Take(5) 在 ObservableCollection 上返回 0 计数

sql-server - 了解 SQL Server 中的六锁

c# - 请调试错误消息。 DbArithmeticExpression 参数必须具有数字通用类型

c# - Entity Framework 中的类和接口(interface)层次结构?