Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架为每种类型的记录选择最近的记录_C#_Sql_Asp.net Mvc_Linq_Entity Framework - Fatal编程技术网

C# 实体框架为每种类型的记录选择最近的记录

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.*

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

+-------+------------+-----------+----------+
|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>();