En una clase LINQ a SQL, ¿por qué son las propiedades que se crea a partir de las claves externas EntitySet
objetos, que implementan IEnumerable
, en tanto que los objetos en la DataContext
Table
son objetos que implementan IQueryable
?EntitySet vs rendimiento de las consultas de mesa en LINQ2SQL
EDITAR: Para aclarar, aquí hay un ejemplo que ilustra lo que trato de entender. Este ejemplo:
ctx.Matches.Where(x => x.MatchID == 1).Single()
.MatchPlayers.Max(x => x.Score);
golpea dos veces la base de datos donde como:
ctx.MatchPlayers.Where(x => x.MatchID == 1)
.Max(x => x.Score);
1 sólo se ejecuta la consulta. Aquí están los rastros:
exec sp_executesql N'SELECT [t0].[MatchID], [t0].[Date]
FROM [dbo].[Matches] AS [t0]
WHERE [t0].[MatchID] = @p0',N'@p0 int',@p0=1
go
exec sp_executesql N'SELECT [t0].[MatchID], [t0].[PlayerID], [t0].[Score]
FROM [dbo].[MatchPlayers] AS [t0]
WHERE [t0].[MatchID] = @p0',N'@p0 int',@p0=1
go
y
exec sp_executesql N'SELECT MAX([t0].[Score]) AS [value]
FROM [dbo].[MatchPlayers] AS [t0]
WHERE [t0].[MatchID] = @p0',N'@p0 int',@p0=1
go
que también muestra que, aún peor, el máximo se realiza a nivel de C# en lugar de en la base de datos.
sé que la razón por la que esto sucede es la diferencia entre IQueryable
s y IEnumerable
s, ¿por qué no el objeto MatchPlayers
en el primer ejemplo implementar la interfaz IQueryable
para obtener los mismos beneficios que el último ejemplo.