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 IQueryables und IEnumerables, warum im ersten Beispiel das MatchPlayers Objekt implementiert nicht die IQueryable Schnittstelle die gleichen Vorteile wie das letztgenannte Beispiel zu erhalten.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top