当前位置 : 主页 > 网络安全 > 测试自动化 >

如何提高LINQ到EF的性能

来源:互联网 收集:自由互联 发布时间:2021-06-22
我有两个类:Property和PropertyValue.属性具有多个值,其中每个值都是新修订. 检索一组属性时,我想包含每个属性的最新版本值. 在T-SQL中,可以非常有效地完成这样的操作: SELECT p.Id,pv1.Str
我有两个类: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
            }
    );
网友评论