C# 嵌套导航属性+生成的SQL查询
我想知道下面生成的查询是否可以改进 我有以下linq表达式:C# 嵌套导航属性+生成的SQL查询,c#,entity-framework,linq,C#,Entity Framework,Linq,我想知道下面生成的查询是否可以改进 我有以下linq表达式: var gps = DBContext.GPS.Where(x => x.ID == id) .Select(c => new { Id = c.ID, Descripcion = c.DESCRIPCION_LARGA, Alarmas = c.ALARMAS.Select(a => new { FechaHor
var gps = DBContext.GPS.Where(x => x.ID == id)
.Select(c => new
{
Id = c.ID,
Descripcion = c.DESCRIPCION_LARGA,
Alarmas = c.ALARMAS.Select(a => new
{
FechaHora = a.FECHAHORA,
CercaDescripcion = a.CERCA.DESCRIPCION_LARGA
})
});
ALARMAS是GPS实体的导航属性。这将生成以下sql查询:
SELECT "Project1"."ID" AS "ID",
"Project1"."DESCRIPCION_LARGA" AS "DESCRIPCION_LARGA",
"Project1"."C1" AS "C1",
"Project1"."GPS_ID" AS "GPS_ID",
"Project1"."FECHAHORA" AS "FECHAHORA",
"Project1"."DESCRIPCION_LARGA1" AS "DESCRIPCION_LARGA1"
FROM
(SELECT "Extent1"."ID" AS "ID",
"Extent1"."DESCRIPCION_LARGA" AS "DESCRIPCION_LARGA",
"Join1"."GPS_ID" AS "GPS_ID",
"Join1"."FECHAHORA" AS "FECHAHORA",
"Join1"."DESCRIPCION_LARGA" AS "DESCRIPCION_LARGA1",
CASE
WHEN ("Join1"."GPS_ID" IS NULL)
THEN NULL
ELSE 1
END AS "C1"
FROM "GPS" "Extent1"
LEFT OUTER JOIN
(SELECT "Extent2"."GPS_ID" AS "GPS_ID",
"Extent2"."ALARMA_ID" AS "ALARMA_ID",
"Extent2"."LOG_ID" AS "LOG_ID",
"Extent2"."CERCA_ID" AS "CERCA_ID",
"Extent2"."FECHAHORA" AS "FECHAHORA",
"Extent3"."ID" AS "ID",
"Extent3"."DESCRIPCION_LARGA" AS "DESCRIPCION_LARGA",
"Extent3"."DESCRIPCION_MED" AS "DESCRIPCION_MED",
"Extent3"."DESCRIPCION_CORTA" AS "DESCRIPCION_CORTA",
"Extent3"."ABREVIACION" AS "ABREVIACION",
"Extent3"."CAPA_ID" AS "CAPA_ID",
"Extent3"."CATEGORIA_ID" AS "CATEGORIA_ID",
"Extent3"."PADRE_ID" AS "PADRE_ID",
"Extent3"."REGION_ID" AS "REGION_ID",
"Extent3"."FORMA_ID" AS "FORMA_ID",
"Extent3"."VERTICE1_LAT" AS "VERTICE1_LAT",
"Extent3"."VERTICE1_LNG" AS "VERTICE1_LNG",
"Extent3"."VERTICE2_LAT" AS "VERTICE2_LAT",
"Extent3"."VERTICE2_LNG" AS "VERTICE2_LNG",
"Extent3"."LAT" AS "LAT",
"Extent3"."LNG" AS "LNG",
"Extent3"."RADIO" AS "RADIO",
"Extent3"."ESTADO_ID" AS "ESTADO_ID",
"Extent3"."CERCA_ENRUTA_ID" AS "CERCA_ENRUTA_ID",
"Extent3"."OBSERVACIONES" AS "OBSERVACIONES"
FROM "GPS_ALARMAS" "Extent2"
LEFT OUTER JOIN "CERCAS" "Extent3"
ON "Extent2"."CERCA_ID" = "Extent3"."ID"
) "Join1" ON "Extent1"."ID" = "Join1"."GPS_ID"
WHERE ("Extent1"."ID" = :p__linq__0)
) "Project1"
ORDER BY "Project1"."ID" ASC,
"Project1"."C1" ASC
我的问题是,当只需要ID和Description_LARGA时,为什么它要查询CERCA Extend3表上的所有列
这能改进吗?还是我不该担心
提前感谢并致以最良好的问候,
Fabian生成的SQL似乎与Linq语句不匹配,因为SQL语句中的列比Linq语句中的列多。嗨,Frank,这就是问题所在。为什么会这样?请注意,我使用的是Oracle ODP.NET,可能是查询提供程序没有正确执行该操作。我的意思是,生成的SQL语句可能不是来自您显示的Linq语句。您是从SQL探查器中获取的吗?如果是这样,您的数据库服务器是否可能被另一个类似于Linq语句的查询击中?我可以向您保证SQL语句来自Linq语句。我在控制台上得到sql语句。它是一个.net核心项目,oracle+实体框架6。该应用程序的配置是为了从linq语句中输出所有sql生成的语句,以便进行调试。我想说,您不必为此担心。子查询选择通常并不重要——只有最终选择才重要,因为这是将在客户端获取的数据。