2008-10-14 14 views
9

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

Respuesta

1

Las tablas son efectivamente una cuestión conceptual: existen realmente en el servidor, por lo que debe consultar para obtener entradas. Las entradas de clave foránea son las que en realidad capta otra consulta, por lo que en ese momento están disponibles localmente. Esa es una descripción bastante lanosa, pero con suerte se supera el concepto general.

3
ctx.Matches.Where(x => x.MatchID == 1).Single() 

Single() devuelve una coincidencia, no un IQueryable (coincidencia).

Just Push Individual() fuera al último paso:

ctx.Matches 
    .Where(m => m.MatchID == 1) 
    .Select(m => m.MatchPlayers.Max(mp => mp.Score)) 
    .Single(); 

Lo que esto demuestra es consulta, que está bien utilizar la propiedad MatchPlayers en una consulta. Lo cual aborda mi interpretación de la pregunta del consultante: "¿Por qué no puedo usar un EntitySet en una consulta?", Puede hacerlo.

0

Esto era addressed on the MSDN forums. La esencia del razonamiento es que es muy difícil hacer un seguimiento de los objetos añadidos y eliminados al realizar consultas en la base de datos. En cambio, EntitySet es una especie de copia local de los objetos relacionados que puede manipular. Desafortunadamente, como habrás notado, esto tiene el efecto secundario de devolver expresiones a las llamadas de LINQ a Objetos en lugar de devolver el LINQ a SQL mejor.

Cuestiones relacionadas