2012-03-26 3 views
0

Ich versuche, eine dynamische Reihenfolge von auf Spalten mit Marc Gravell-Code zu tun. Ich poste die 2 Fragen. Es funktioniert in einem Fall, funktioniert aber im zweiten Fall nicht. Kann mir jemand sagen, welche Änderungen ich vornehmen muss, damit beide Abfragen perfekt ablaufen?Marc Gravell Dynamic OrderBy funktioniert in einem Fall, aber nicht in anderen

Dies ist der Link zur Antwort des Marc GRA:

https://stackoverflow.com/a/233505

I Northwind-Datenbank verwenden. Dies sind meine beiden Anfragen:

var query = (from cust in northwindEntities.Customers 
       select new 
       { 
        City = cust.City , 
        Orders = northwindEntities.Orders 
         .Where(o => o.CustomerID == cust.CustomerID) 
         .OrderBy("OrderID") 
       }); // doesn't work. 

var query = (from cust in northwindEntities.Customers 
       select new 
       { 
        City = cust.City , 
        //Orders = northwindEntities.Orders.Where(o => o.CustomerID == cust.CustomerID). 
        // OrderBy("OrderID") 
       }).OrderBy("City"); // works 

Hier ist die Ausnahme von der ersten Abfrage:

LINQ to Entities erkennt nicht die Methode ‚System.Linq.IOrderedQueryable 1[ConsoleApplication12.Order] OrderBy[Order](System.Linq.IQueryable 1 [ConsoleApplication12.Order] , System.String) 'Methode, und diese Methode kann nicht in einen Speicherausdruck übersetzt werden.

+3

Was funktioniert nicht? –

+0

@ ta.speot.is: Ausnahme wurde bereits veröffentlicht. Bitte sehen Sie meine Bearbeitung. – Jaggu

+0

Sollte wahrscheinlich 'Orders = cust.Orders.OrderBy (" OrderID ")' sein. Nicht sicher, ob das dein Problem jedoch beheben wird. –

Antwort

0

Sie müssen den letzten Satz von Ergebnis bestellen, wie Sie es in dem zweiten Fall tun. Im ersten Fall bestellen Sie nur northwindEntities.Orders.Where( Ergebnis und nicht letzte.

Die richtige Abfrage ist die zweite.

+0

Aber ich muss die innere Unterabfrage und nicht die äußere bestellen. – Jaggu

+0

@Jaggu: An diesem Punkt, was funktioniert nicht in Ihrer * ersten * Abfrage? – Tigran

+0

Ich habe die 'Ausnahme' gepostet. – Jaggu

0

Natürlich wäre es nicht wegen des gleichen Grundes arbeiten, wie

var query = (from cust in northwindEntities.Customers 
      select new 
      { 
       City = cust.City , 
       Orders = northwindEntities.Orders 
        .MyCustomMethod() 
      }); 

wird nicht funktionieren. LINQ-to-Entities durchlaufen diesen Ausdrucksbaum und versuchen ihn in SQL zu konvertieren. Es kann mit bekannten Untermengen von Methoden arbeiten, die in SQL übersetzt werden.

Aber in der zweiten Abfrage, benutzerdefinierte OrderBy Methode erstellt dynamisch die OrderBy, die LINQ-to-Entities kennt.

+0

Ich verstehe den Grund, aber keine Problemumgehung, um es erfolgreich zu machen? Es passiert heutzutage so, dass ich, was auch immer ich versuche, die Grenzen des EF treffe. Ich denke, ich sollte nur zu NHibernate wechseln. – Jaggu

+0

@ Jaggu Dies wäre ein inhärentes Problem in jedem LINQ-Provider, der versucht, den Ausdrucksbaum in SQL oder andere zu übersetzen. – Eranga

+0

NHibernate's CriteriaQueries sind viel besser und robuster. Wir können Twist and Turn-Abfragen verwenden und es funktioniert immer noch. Deshalb ist es in der Gemeinde so beliebt. – Jaggu

Verwandte Themen