2017-06-29 9 views
0

Ich habe einige Legacy-Code, der Entity Framework verwendet.Entity Framework unter der Haube

Wenn ich den Code debuggen kann ich sehen, dass EF DbContext die gesamte Tabelle enthält. Es wurde von OData an das Frontend übergeben und dann eckig verarbeitet.

Also habe ich versucht zu suchen, ist es möglich, nur einen einzigen Datensatz von EF zu bekommen?

Überall sehe ich die SingleOrDefault Methode oder andere IQueryable, aber wie ich verstanden habe, sind diese Teile der collections.

Microsoft sagt: Manchmal ist der Wert von Standard (TSource) nicht der Standardwert, den Sie verwenden möchten, wenn die Sammlung keine Elemente enthält.

Bedeutet das, EF immer alle Daten aus der Tabelle und ich kann sie später verwenden?

Oder gibt es eine Möglichkeit, innere Abfrage zu erzwingen, nur eine und nur eine Zeile zu erhalten?

Wir verwenden postgresql.

+0

Haben Sie versucht ".Take (1)", oder missverstehe ich Sie? –

+1

Ihre Frage ergibt keinen Sinn. Ja, Sie können 'Single()' und andere Methoden aufrufen, wo immer Sie möchten. – SLaks

+0

und wird die innere Abfrage 'SELECT * FROM Tabelle WHERE ID = 23' sein? – vaso123

Antwort

1

Mit Entity Framework können Sie LINQ verwenden, um Abfragen auszuführen und einzelne Datensätze oder begrenzte Sätze zu erhalten. In Ihrem .NET-Projekt sollte der Controller jedoch OData-Abfrageparameter analysieren und das Dataset filtern, bevor Ergebnisse an die Clientanwendung zurückgegeben werden. Überprüfen Sie Ihren Controller-Code unter this tutorial, um festzustellen, ob Ihnen etwas fehlt.

Wenn Sie das integrierte OData-Framework irgendwie umgehen, kann es hilfreich sein zu verstehen, welche Abfragen sofort ausgeführt werden und welche nicht. Siehe , um genau zu verstehen, welche Operationen eine Reise in die Datenbank erzwingen und versuchen, alles so schnell wie möglich mit sofortiger Ausführung abzuwehren.

+0

Ich denke das war was ich brauche. Ich brauche nur einen Tag, während ich überprüfe. Wenn 'public SingleResult Get ([FromODataUri] int key)' funktioniert, werde ich es akzeptieren. Upvote. – vaso123

+0

@ vaso123 Danke, vergiss nicht, den '' '[EnableQuery]' '' '- Dekorator hinzuzufügen, damit ASP.Net die OData-Abfrageparameter automatisch parsen kann – RemedialBear

+0

Danke für die Links. – vaso123

1

Nein, EF wird nicht die gesamte Tabelle in den Speicher WÄHLEN, wenn Sie es richtig verwenden. Durch richtig; Ich meine:

context.Table.First(); 

Wird in einer SQL-Abfrage übersetzen, die nur eine Zeile zurückgibt, die dann auf ein Objekt abbildet zu dem anrufenden Code zurückgegeben werden. Dies liegt daran, dass der obige Code LINQ-to-Entities verwendet. Wenn Sie so etwas wie dies stattdessen tat:

context.Table.ToList().First(); 

Dann wird die gesamte Tabelle ausgewählt, um die ToList Arbeit zu machen, und LINQ-to-Objects übernimmt die First. So lange Sie Ihre Abfragen mit Lazy Enumeration (das Ergebnis nicht vor der Zeit zu realisieren) tun, wird es Ihnen gut gehen.

+2

Wenn Sie ASP.NET MVC OData verwenden, ist dies ein wenig verwirrend, da Ihr Controller die Basisabfrage zurückgibt und der vom Client übergebene URI mit der von Ihrem Controller zurückgegebenen Abfrage zusammengesetzt wird, bevor er in SQL übersetzt und ausgeführt wird . –

+0

@ DavidBrowne-Microsoft Leistung ist der Flaschenhals für unser Unternehmensprojekt. Ich bin neu in C# und ASP.NET und wir haben Zeit, unseren Code zu erkunden. Wie ich traurig bin, benutzen wir postgre. Was empfehlen Sie? Sollten wir unsere eigene DB-Ebene schreiben (wie 'Db.getRow (sqlCmd)'), was beinhaltet 'SELECT field1, field2 FROM Benutzer WHERE id = 242' (was gibt uns 1 Zeile zurück) oder ist das mit EF möglich? Und fallen EF und OData – vaso123

+0

"Was empfehlen Sie?" Erfahren Sie, wie Sie EF und OData effektiv nutzen. –

Verwandte Themen