我有两个类:Property和PropertyValue.属性具有多个值,其中每个值都是新修订. 检索一组属性时,我想包含每个属性的最新版本值. 在T-SQL中,可以非常有效地完成这样的操作: SELECT p.Id,pv1.Str
检索一组属性时,我想包含每个属性的最新版本值.
在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 } );