我有两个类: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
}
);