EntitySet vs Tabelle Abfrageleistung in LINQ2SQL
-
03-07-2019 - |
Frage
In einem LINQ to SQL-Klasse, warum sind die Eigenschaften, die von dem Fremdschlüssel erstellt werden EntitySet
Objekte, die IEnumerable
implementieren, wo als die Objekte auf der DataContext
sind Table
Objekte, die IQueryable
implementieren?
EDIT: Um zu klären, hier ist ein Beispiel, das zeigt, was ich versuche zu verstehen. Dieses Beispiel:
ctx.Matches.Where(x => x.MatchID == 1).Single()
.MatchPlayers.Max(x => x.Score);
trifft auf die Datenbank zweimal wo, wie:
ctx.MatchPlayers.Where(x => x.MatchID == 1)
.Max(x => x.Score);
läuft nur 1 Abfrage. Hier sind die Spuren:
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
und
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
, die auch zeigen, dass, noch schlimmer, das max an der C # Ebene erfolgt und nicht in der Datenbank.
Ich weiß, dass der Grund, dies geschieht, ist der Unterschied zwischen IQueryable
s und IEnumerable
s, warum im ersten Beispiel das MatchPlayers
Objekt implementiert nicht die IQueryable
Schnittstelle die gleichen Vorteile wie das letztgenannte Beispiel zu erhalten.
Lösung
Die Tische sind effektiv eine konzeptionelle Angelegenheit - sie auf dem Server wirklich existiert, so müssen Sie die Abfrage-Einträge zu erhalten. Die Fremdschlüsseleinträge sind die, die tatsächlich von einer anderen Abfrage geholt, so an diesem Punkt sie lokal verfügbar sind. Das ist eine ziemlich wollig Beschreibung, aber hoffentlich wird es über das allgemeine Konzept.
Andere Tipps
ctx.Matches.Where(x => x.MatchID == 1).Single()
Single () gibt ein Spiel, kein IQueryable (Match).
Just Push Einzel () aus bis zum letzten Schritt:
ctx.Matches
.Where(m => m.MatchID == 1)
.Select(m => m.MatchPlayers.Max(mp => mp.Score))
.Single();
Was diese Abfrage zeigt, ist, dass es in Ordnung ist, die MatchPlayers Eigenschaft in einer Abfrage zu verwenden. Welche Adressen meiner Interpretation der Frage des Fragestellers - „Warum kann ich nicht ein EntitySet in einer Abfrage verwenden?“, Sie können
.Dies war adressiert auf die MSDN-Foren . Der Kern der Argumentation ist, dass es sehr schwierig ist, hinzugefügt und entfernt Objekte zu verfolgen, während Abfragen in der Datenbank zu machen. Stattdessen ist die EntitySet etwas von einer lokalen Kopie der zugehörigen Objekte, die Sie bearbeiten können. Leider, wie Sie bemerkt haben, hat dies den Nebeneffekt von Ausdrücken in LINQ to Objects ruft anstelle der besseren Leistung LINQ to SQL zufallen.