Laden...

ADO.NET EF, Einfache Where-Abfrage mit Entitäten

Erstellt von Flauschi vor 15 Jahren Letzter Beitrag vor 15 Jahren 1.675 Views
F
Flauschi Themenstarter:in
14 Beiträge seit 2006
vor 15 Jahren
ADO.NET EF, Einfache Where-Abfrage mit Entitäten

Hallo,
ich beschäftige mit jetzt seit einiger Zeit mit dem Ado.NET Entity Framework
und habe ein Problem mit folgender Abfrage.


var query =
from product in storage.Products
where product.Supplier.Name == "123"
select product;

Zu meiner Datenbasis.
Ich habe zwei Tabellen, Product und Supplier ( 1:n ),
Ein Artikel kann also beliebige Lieferanten haben.

Das Problem:
Bei der Abfrage wird eine NullReferenceException ausgelöst.
Da product.Supplier = NULL ist.

Diesen müsste ich jetzt folgendermaßen laden,


product.Supplier.Load();

, dann wäre product.Supplier nicht mehr null.
Aber wie soll ich das in einer Where-Abfrage machen?

Das Problem lässt sich folgendermaßen umgehen,


Product supplier = null;
foreach ( var product in storage.Products ) {
if ( !product.Supplier.IsLoaded )
product.Supplier.Load ( );

if ( product.Supplier.Name == "123" ) {
supplier = product.Supplier;
break;
}
}

// tue irgendwas mit supplier ...

Das Funktioniert zwar, die Abfrage dauert aber um einiges länger.
Das kann es doch nicht gewesen sein?
Irgendetwas muss ich doch übersehen haben.

ps. bin verzweifelt.
Danke für eure Hilfe.

Grüße
Ronny

731 Beiträge seit 2006
vor 15 Jahren

Hi Flauschi,

da .Net intern aus einer LINQ-Anweisung doch sicherlich auch nichts anderes als verschachtelte foreach´es machen wird (glaube ich zumindest), denke ich mal wird es (selbst wenn dir die Syntax etwas wie von dir gewünschtes anbietet) auf die selbe Ausführungszeit hinauslaufen.

Aber schau dir mal folgendes an:

http://blogs.msdn.com/dparys/archive/2008/10/14/dynamische-abfragen-mit-linq.aspx

Vielleicht hilft dir das ja

MfG
wax

F
Flauschi Themenstarter:in
14 Beiträge seit 2006
vor 15 Jahren
Bei Linq To Sql funktioniert es, aber nicht bei ADO.NET EF

... also das .NET intern das ganze als ForEach schleifen bastelt stimmt nicht.
Gott sei Dank!

Mit Linq To Sql funktioniert das zuvor beschriebene Szenario.
Die Abfragen auf meinem Sql-Server geben ganz klar eine Where-Anweisung mit aus.
Dies kann ich auch dem Link von dir entnehmen.
Nur beim Ado.NET Entity Framework, welches eigentlich der große Bruder sein soll, funktioniert das nicht.

Hilfe 😦

5.742 Beiträge seit 2007
vor 15 Jahren

Hallo Flauschi,

probiere mal etwas wie


var query = from product in storage.Products
where product.Supplier != null && product.Supplier.Name == "123"
select product;

Eventuell löst das das Problem.

da .Net intern aus einer LINQ-Anweisung doch sicherlich auch nichts anderes als verschachtelte foreach´es machen wird (glaube ich zumindest)

Nein, nein - das ist ja gerade das tolle an LINQ.
LINQ to Entities generiert passende SQL Queries zu den Abfragen. Und das zur Laufzeit.

5.941 Beiträge seit 2005
vor 15 Jahren

Hallo zusammen

Nein, nein - das ist ja gerade das tolle an LINQ.
LINQ to Entities generiert passende SQL Queries zu den Abfragen. Und das zur Laufzeit.

Zuerst in Expressiontrees, dann in SQL -Queries.

Und der Zugriff auf die Daten erfolgt erst beim Durchiterieren bzw. direkten Zugriffs auf das Endergebniss.

D.h. es spielt auch keine Rolle wenn man zwei Queries macht, diese dann zusammenführt und zurückliefert.
Der Speed bleibt der gleiche, wie wenn man das in eine Query kombiniert.

Gruss Peter

--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011

84 Beiträge seit 2007
vor 15 Jahren

from product in storage.Products**:::

Gruß,
Razer