我有一个名为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#应用程序中使用实体框架实现相同的输出?
答案 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)
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>
。