2 Stimmen

LINQ to SQL arbeitet mit Fremdschlüssel-Tabellenzeilen

Ich bin neu in LINQ to SQL, daher diese Frage.

Wenn ich eine Abfrage für eine Zeile mache, holt LINQ to SQL dann standardmäßig alle anderen Schlüsselzeilen?

z. B:

Nehmen wir an, ich habe eine 1->N Beziehung zu 3 Tabellen

Branche -N> Abteilungen -N> Mitarbeiter Wenn ich eine Markenzeile abfrage

Branch b = (
    from b in brachDataContext.Branches 
    where b.id = id 
    select b).ToList();

Werden dadurch alle Abteilungen, die mit der Zweigstellenzeile verbunden sind, und die mit diesen Abteilungen verbundenen Mitarbeiter abgerufen?

Wenn ja, wäre das nicht ein riesiges Objekt. Jede Niederlassung könnte 10 Abteilungen haben und jede Abteilung könnte 1000 Mitarbeiter haben, und wir brauchen vielleicht nicht alle Datensätze.

3voto

Mikael Östberg Punkte 16703

Linq 2 SQL verwendet standardmäßig eine verzögerte Ausführung, was bedeutet, dass Ihre Abteilungen abgerufen werden, wenn Sie diese Sammlung aufzählen.

Sie können jedoch steuern, ob sie in die ursprüngliche Abfrage aufgenommen werden sollen, indem Sie die Option context.LoadOptions Eigenschaft wie folgt

DataLoadOptions dlo = new DataLoadOptions();
dlo.LoadWith<Branch>(b => b.Departments);
context.LoadOptions = dlo;
... query ...

Siehe diese Stelle für weitere Informationen zur aufgeschobenen Ausführung.

Informieren Sie sich auch über den Unterschied zwischen IEnumerable und IQuerable und deren Verhalten. Dies ist der Schlüssel zum Verständnis aller Linq-Anbieter.

Als Vorwarnung, meine Erfahrung ist, dass Linq 2 Sql für kleinere Projekte und schnelle Entwicklung usw. funktioniert. Wenn Sie alles im Hinterkopf, sollten Sie den Umstieg auf Entity Framework oder NHibernate in Erwägung ziehen, um eine umfassendere Funktionalität zu erhalten.

0voto

SimonGates Punkte 5753

Wenn ja, wird das nicht ein riesiges Objekt sein. jeder Zweig könnte 10 Abteilungen haben und jede Abteilung hat vielleicht 1000 Mitarbeiter, und wir brauchen vielleicht nicht alle Datensätze benötigen.

Branch b = (      from b in brachDataContext.Branches      
                  where b.id = id      
                  select b).ToList(); 

Der von Ihnen angegebene Code führt dazu, dass die Abfrage jedes Mal ausgeführt wird, wenn diese Codezeile aufgerufen wird, wobei ALLE Daten abgerufen und im Speicher gespeichert werden. Das liegt daran, dass Sie .ToList() verwenden.

Erwägen Sie IQueryable<T> o IEnumerable<T> - wird das "Lazy Loading" verwendet (falls aktiviert) und sollte nur die Daten abrufen, die benötigt werden.

Sie können auch einen SQL-Profiler verwenden, um genau zu sehen, wann eine Abfrage in der Datenbank ausgeführt wird.

0voto

Pleun Punkte 8836

Kein linq-to-sql macht Lazy Loading, es sei denn, Sie geben etwas anderes an.

Wenn Sie auch die Details laden möchten, können Sie Loadoptions in Ihrem Datentext verwenden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X