C# 实体框架为每种类型的记录选择最近的记录
我有一个名为values的表,如下所示:C# 实体框架为每种类型的记录选择最近的记录,c#,sql,asp.net-mvc,linq,entity-framework,C#,Sql,Asp.net Mvc,Linq,Entity Framework,我有一个名为values的表,如下所示: +-------+------------+-----------+----------+ |Id |DateTime |SensorId |Value | +-------+------------+-----------+----------+ SensorId是传感器详细信息表的外键。此值表中将有10万条以上的记录 我可以运行这个sql命令来返回每个SensorId的最新记录,它大约在0.3秒内运行 SELECT a.*
+-------+------------+-----------+----------+
|Id |DateTime |SensorId |Value |
+-------+------------+-----------+----------+
SensorId是传感器详细信息表的外键。此值表中将有10万条以上的记录
我可以运行这个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应用程序中使用entity framework实现相同的输出,同时保持或提高性能?使用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编译查询
我想它不可能达到比纯SQl查询更好的性能,因为通过使用EF,您将向流程添加抽象层。
使用GroupBy命令时,EF通常非常慢。我建议直接在EF中尝试sql查询
此代码适用于EF Core
FromSqlRaw比普通Linq查询更快。对于EF,您可以用同样的方法尝试context.ExecuteQuery。这可以工作,但运行需要6秒钟。我需要它更快。将它放入视图,将视图添加到EF。
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>();