实体框架为每种类型的记录选择最新记录

时间:2014-08-27 23:23:43

标签: c# sql asp.net-mvc linq entity-framework

我有一个名为values的表,如下所示:

+-------+------------+-----------+----------+
|Id     |DateTime    |SensorId   |Value     |
+-------+------------+-----------+----------+

SensorId是传感器详细信息表的外键。此值表中将有10m +记录。

我可以运行此sql命令返回每个SensorId的最新记录,并且它在大约0.3秒内运行。

SELECT a.*
    FROM Values as a
    INNER JOIN (
        SELECT SensorId, MAX(ID) maxId 
        FROM Values
        GROUP BY SensorId
    ) b ON a.SensorId = b.SensorId 
        AND a.Id = b.maxId
ORDER BY a.SensorId ASC

如何在保持(或改善)性能的同时在c#应用程序中使用实体框架实现相同的输出?

2 个答案:

答案 0 :(得分:7)

使用LINQ to Entities和lambdas,您可以这样做:

dataContext.Values.GroupBy(p => p.SensorId)
     .Select(p => p.FirstOrDefault(w => w.Id == p.Max(m => m.Id)))  
     .OrderBy(p => p.SensorId).ToList()

其中dataContext是ObjectContext类的实例。 ToList()编译查询。

答案 1 :(得分:0)

  1. 我想不可能达到比纯SQl查询更好的性能,因为通过使用EF,您正在向流程中添加抽象层。
  2. 使用GroupBy命令时,EF通常非常慢。我建议直接在EF中尝试sql查询 (此代码用于 EF Core
context.Values.FromSqlRaw<Values>("SELECT a.*
    FROM Values as a
    INNER JOIN (
        SELECT SensorId, MAX(ID) maxId 
        FROM Values
        GROUP BY SensorId
    ) b ON a.SensorId = b.SensorId 
        AND a.Id = b.maxId
ORDER BY a.SensorId ASC").ToList<Values>();

FromSqlRaw比普通的Linq查询要快。对于EF,您可以通过相同的方式尝试context.ExecuteQuery<Values>