Frage

Das Ziel ist es, die wenigsten Anfragen zur Ausgabe von zu SQL Server LINQ to SQL verwenden, ohne anonyme Typen zu verwenden. Der Rückgabetyp für die Methode müssen IList sein. Die Beziehungen sind wie folgt:

            Parent
    Child1          Child2
Grandchild1

Parent> Child1 ist eine Eins-zu-viele-Beziehung

Child1> Grandchild1 ist eine Eins-zu-n-Beziehung (wobei n Null bis unendlich)

Parent> Child2 ist eine Eins-zu-n-Beziehung (wobei n Null bis unendlich)

Ich bin in der Lage zu eifrig Last der Eltern, Child1 und Grandchild1 Daten in einer Abfrage auf SQL Server führen.

Diese Abfrage mit Ladeoptionen eifrigen Lasten alle der Daten, mit Ausnahme der Geschwisterdaten (Child2):

DataLoadOptions loadOptions = new DataLoadOptions();
loadOptions.LoadWith<Child1>(o => o.GrandChild1List);
loadOptions.LoadWith<Child1>(o => o.Parent);

dataContext.LoadOptions = loadOptions;

IQueryable<Child1> children = from child in dataContext.Child1
                                select child;

Ich brauche auch die Geschwister Daten zu laden. Ein Ansatz, den ich versucht habe, ist Splitting die Abfrage in zwei LINQ to SQL-Abfragen und die Zusammenführung der Ergebnismengen zusammen (nicht schön), aber auf die Geschwister den Zugriff auf Daten ist faul geladen sowieso.

die Geschwister Last Option Hinzufügen wird eine Abfrage an SQL Server ausgeben für jeden Grandchild1 und Child2 Satz (das ist genau das, was ich zu vermeiden versuche):

DataLoadOptions loadOptions = new DataLoadOptions();
loadOptions.LoadWith<Child1>(o => o.GrandChild1List);
loadOptions.LoadWith<Child1>(o => o.Parent);
loadOptions.LoadWith<Parent>(o => o.Child2List);

dataContext.LoadOptions = loadOptions;

IQueryable<Child1> children = from child in dataContext.Child1
                                select child;


exec sp_executesql N'SELECT * FROM [dbo].[Child2] AS [t0]
WHERE [t0].[ForeignKeyToParent] = @p0',N'@p0 int',@p0=1

exec sp_executesql N'SELECT * FROM [dbo].[Child2] AS [t0]
WHERE [t0].[ForeignKeyToParent] = @p0',N'@p0 int',@p0=2

exec sp_executesql N'SELECT * FROM [dbo].[Child2] AS [t0]
WHERE [t0].[ForeignKeyToParent] = @p0',N'@p0 int',@p0=3

exec sp_executesql N'SELECT * FROM [dbo].[Child2] AS [t0]
WHERE [t0].[ForeignKeyToParent] = @p0',N'@p0 int',@p0=4

Ich habe auch auf SQL geschrieben LINQ-Abfragen in allen Daten in der Hoffnung, dass es würde eifrig Last der Daten jedoch, wenn die LINQ to SQL EntitySet von Child2 oder Grandchild1 zu verbinden sind sie faul Lasten auf die Daten zugegriffen.

Der Grund für die Rücksendung des IList ist zu Hydrat Geschäftsobjekten.

Meine Gedanken sind Ich bin entweder:

  1. Annäherung an dieses Problem in die falsche Richtung.
  2. Haben Sie die Möglichkeit, eine gespeicherte Prozedur aufrufen?
  3. Meine Organisation sollte LINQ to SQL als ORM nicht verwenden?

Jede Hilfe sehr geschätzt.

Danke,

-Scott

War es hilfreich?

Lösung

Was haben Sie sollte korrekt sein, müssen Sie diesen dataContext.DeferredLoadingEnabled = false; zusätzlich zu den Loadoptions hinzuzufügen, die Sie bereits Einstellung sind.

Andere Tipps

var children2 = from child2 in dataContext.Child2
                where children.Any(c1 => c1.Parent == child2.Parent)
                select child2;

Sollte in einem einzigen Folge Abfrage vorhanden ist, so wird es zwei Abfragen am Ende wird.

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