Dans un LINQ à la classe SQL, pourquoi sont les propriétés qui sont créés à partir des clés étrangères EntitySet
objets qui mettent en œuvre IEnumerable
, où les objets du DataContext
sont Table
objets qui mettent en œuvre IQueryable
?EntitySet vs tableau les performances des requêtes dans LINQ2SQL
EDIT: Pour clarifier, voici un exemple qui illustre ce que j'essaie de comprendre. Cet exemple:
ctx.Matches.Where(x => x.MatchID == 1).Single()
.MatchPlayers.Max(x => x.Score);
frappe deux fois la base de données où que:
ctx.MatchPlayers.Where(x => x.MatchID == 1)
.Max(x => x.Score);
ne fonctionne que 1 requête. Voici les traces:
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
et
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
qui montre aussi que, pire encore, le maximum est fait au niveau C# plutôt que dans la base de données.
Je sais que la raison pour laquelle cela se produit est la différence entre IQueryable
s et IEnumerable
s, alors pourquoi ne pas l'objet MatchPlayers
dans le premier exemple implémenter l'interface IQueryable
pour obtenir les mêmes avantages que le dernier exemple.