2011-12-18 36 views
4

我有两个类:Property和PropertyValue。属性具有多个值,其中每个值都是新修订版。如何提高LINQ到EF的性能

当检索一组属性时,我想包含每个属性值的最新版本。

在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 

“魔术师”在此查询是加入上比条件较小,查找行,而不由左强迫的结果加入。

如何使用LINQ to EF来实现类似的功能?

我能想出的最好的事情是:

from pv in context.PropertyValues 
group pv by pv.Property into g 
select g.OrderByDescending(p => p.Revision).FirstOrDefault() 

它不会产生正确的结果,但比其他慢10倍左右。

回答

1

也许这可以提供帮助。其中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 
      } 
    ); 
+0

这个效果非常好!谢谢!! – user1104938 2011-12-19 08:28:40

+1

也许你可以接受解决方案吗? – Arion 2011-12-19 09:01:48

0
,如果你要使用多个条件(而不是表达降低)

捧场,你可以做到这一点像

from pv1 in db.PropertyValues 
join pv2 in db.PropertyValues on new{pv1.Property_ID, Condition = pv1.Revision < pv2.Revision} equals new {pv2.Property_ID , Condition = true} into temp 
from t in temp.DefaultIfEmpty() 
      join p in db.Properties 
       on pv1.Property_Id equals p.Id 
      where t.Id==null 
      orderby p.Id 
      select new 
      { 
       p.Id, 
       pv1.StringValue, 
       pv1.Revision 
      } 
+0

你是男人!我不知道DefaultOrEmpty()会产生一个LEFT JOIN。当你考虑它时,这很明显。必须做一些像pv1.Property.Id和其中t == null,但除了它的位置上的变化!谢谢! – user1104938 2011-12-19 08:27:05

+0

分组查询非常慢,因为它为组的每个键单独执行 – 2011-12-19 09:41:31

1

下一页优化中的LINQ查询的实体,您还必须了解Entity Framework将查询转换为SQL所需的工作,然后将结果映射回您的对象。

将Linq To Entities查询直接比较为SQL查询总是会导致性能下降,因为Entity Framework为您做了很多工作。

因此,查看优化实体框架所采用的步骤也很重要。

事情可以帮助:

  • 预编译查询
  • 预生成视图
  • 自己决定何时开放数据库连接
  • 禁用跟踪(如适用)

Here you can find some documentation具有性能策略。

+0

谢谢,我使用sql分析器比较它。与MMS对比时,这应该尽可能公平吗? – user1104938 2011-12-19 08:24:54

+0

如果您正在查看生成的SQL查询并测量只有SQL部分的执行时间到您的手写SQL,它应该是公平的我想:) – 2011-12-19 08:39:30