2009-06-15 1 views
2

Grüße,Wie sortieren verbundene Unternehmen mit eifrigen Läden in ADO.NET Entity Framework

die Beispieltabellen Northwind Unter Berücksichtigung Kunden, Aufträge und Orderdetails ich die verbundenen Unternehmen in den Tabellen oben genannten entsprechenden eifrig Last möchte und Trotzdem muss ich die untergeordneten Entitäten in der Datenbank bestellen, bevor Entitäten abgerufen werden.

Grund Fall:

var someQueryable = from customer in northwindContext.Customers.Include("Orders.OrderDetails") 
select customer; 

aber ich brauche auch Aufträge und Orderdetails auf der Datenbankseite zu sortieren (vor diejenigen Entitäten in den Speicher zu holen) in Bezug auf einige zufällige Spalte dieser Tabellen. Ist es möglich ohne irgendeine Projektion, wie es in T-SQL ist? Es spielt keine Rolle, ob die Lösung e-SQL oder LINQ zu Entitäten verwendet. Ich suchte im Internet, aber ich war nicht zufrieden mit den Antworten, die ich fand, da sie hauptsächlich Daten auf einen anonymen Typ projizieren und dann diesen anonymen Typ erneut abfragen, um die untergeordneten Entitäten in der von Ihnen gewünschten Reihenfolge zu erhalten. Auch die Verwendung von CreateSourceQuery() scheint für mich keine Option zu sein, da ich die Daten auf der Datenbankseite abrufen muss, indem ich eifrig lade, aber einfach untergeordnete Entitäten anordne. Das ist, ich möchte das "ORDER BY" tun, bevor Sie eine Abfrage ausführen und dann die Entitäten in der Reihenfolge abrufen, die ich möchte. Vielen Dank im Voraus für jede Anleitung. Als persönliche Anmerkung entschuldigen Sie bitte die direkte Sprache, da ich bei Microsoft ziemlich angepisst bin, weil ich das EF in einer so unreifen Form veröffentlicht habe, sogar im Vergleich zu Linq to SQL (von dem sie langsam wegzukommen scheinen). Ich hoffe, dass dieses EF-Ding in der Release-Version von .NET FX 4.0 viel besser und ohne signifikante Bugs wird.

Antwort

2

Sie verwechseln zwei verschiedene Probleme. Der erste Schritt besteht darin, Entitäten in der Datenbank zu materialisieren, der zweite besteht darin, wie eine geordnete Liste abgerufen werden kann. Der EntityCollection-Typ ist keine geordnete Liste. In Ihrem Beispiel ist customer.Orders eine EntityCollection.

Auf der anderen Seite, wenn Sie eine Liste in einer bestimmten Reihenfolge erhalten möchten, können Sie das tun; Es kann nicht in einer Eigenschaft vom Typ EntityCollection sein. Zum Beispiel:

from c in northwindContext.Customers 
orderby c.SomeField 
select new { 
    Name = c.Name, 
    Orders = from o in c.Orders 
      orderby c.SomeField 
      select new { 
       SomeField = c.SomeField 
      } 
} 

Hinweis, dass es kein Aufruf einschließen. Weil ich projiziere, ist es unnötig.

Das Entity Framework funktioniert möglicherweise nicht in der von einem LINQ zu SQL-Hintergrund erwarteten Weise, aber es funktioniert. Sei vorsichtig mit der Verurteilung, bevor du es verstehst; zu entscheiden, dass es nicht funktioniert, wird verhindern, dass Sie lernen, wie es funktioniert.

+0

Warum brauchen Sie 'select new {SomeField = c.SomeField}' anstelle von 'select c.SomeField'? Wenn du die Orden willst, warum ist es dann nicht "select o"? –

+0

könnte es sein. Aber wenn Sie nicht jede Spalte (häufig) benötigen, ist es viel effizienter, nur das auszuwählen, was Sie brauchen. Der selbe Grund, warum Sie normalerweise nicht 'SELECT *' in SQL schreiben (naja, * ich * tue das überhaupt nicht ...). –

8

Eigentlich habe ich Tip, die genau dieses Problem adressiert.

Wenn Sie dies tun:

der verbundenen Einrichtungen Sortierung ist nicht ‚unterstützt‘, aber mit dem Vorsprung Ansatz Craig zeigt UND auf etwas unter Berufung ‚Beziehung Fixup‘ genannt können Sie etwas sehr ähnlicher Arbeits bekommen

var projection = from c in ctx.Customers 
       select new { 
         Customer = c, 
         Orders = c.Orders.OrderByDescending( 
           o => o.OrderDate 
          ) 
       }; 

foreach(var anon in projection) 
{ 
    anon.Orders //is sorted (because of the projection) 
    anon.Customer.Orders // is sorted too! because of relationship fixup 
} 

Was bedeutet, wenn Sie dies tun:

var customers = projection.AsEnumerable().Select(x => x.Customer); 

Sie Kunden haben, die haben sortierte Bestellungen!

Siehe den Tipp für weitere Informationen.

this helps

Alex

0

Danke euch beiden. Ich verstehe, dass ich die Projektion verwenden kann, um das zu erreichen, was ich wollte, aber ich dachte, dass es eine einfache Möglichkeit gibt, dies zu tun, da es in T-SQL-Welt mit einigen verschachtelten Abfragen (oder Joins) und Bestellbits durchaus möglich ist. Auf der anderen Seite klingt die Trennung von Bedenken vernünftig und wir befinden uns jetzt in der Entitätsdomäne. Daher werde ich die beiden empfohlenen Methoden verwenden, obwohl ich zugeben muss, dass dies in LINQ to SQL mit AssociateWith einfacher und sauberer ist.

Mit freundlichen Grüßen.

Verwandte Themen