2017-06-08 2 views
0

Ich habe eine übergeordnete Abfrage mit Unterabfrage zurück Kind, , was ich nach einer Eigenschaft in Parent Child Abfrage sortieren muss. hier ist sudo Code:linq geschachtelte Abfrage bedingte Reihenfolge von

from menu in db.Menus 
        orderby menu.Order 
        select new 
        { 
         Title= menu.Title, 
         OrderNumber = menu.Order, 
         data = (from menuItem in menu.Items 
            let g = Guid.NewGuid() 
            orderby g 
           select new 
           { 
            id = worker.ID, 
            Title = worker.JobTitle 
            }) 
           .Take(4) 

        }; 

, die funktioniert ok, aber was ich brauche Menü in random (NewGuid) zu sortieren und sortieren, andere mit ihrem Element Priorität ein Ding wie es:

let g = Guid.NewGuid() 
orderby menu.ISRandom ? g: menuItem.Order 

Aber es gibt Fehler über Mismatch Guid und Int. Was ist die Lösung? Sekunde: Wie kann ich take(4) with take(menu.size) ersetzen? danken der

+0

Was ist 'orderbymenu'? –

+0

Sorry, es war Syntaxfehler. Korrektur ist orderby menu.IsRandom? g: menuItem.Order @GertArnold – SeifolahG

Antwort

1

Sie können die Bestell Problem lösen ToString() durch Zusatz:

let g = Guid.NewGuid().ToString() 
orderbymenu.ISRandom ? g : menuItem.Order.ToString() 

Mit Take(someProperty) nicht in einer EF LINQ-Abfrage erlaubt. Dies liegt daran, dass der Take in eine TOP(x)-Klausel übersetzt wird, die sich möglicherweise nicht auf eine Spalte im SQL-Ergebnis beziehen kann. Sie können dies erst nachher durchführen, nachdem Sie die Ergebnisse ohne Take in den Speicher gezogen haben (oder ein angemessenes festes Maximum nehmen).

+0

Würde 'ToString' keine falsche Reihenfolge verursachen, wenn' menuItem.Order' 'int' ist? –

+0

Ja, guter Punkt. Ich ändere es besser in einen "OrderBy" -Aufruf, der bedingt aufgebaut ist. Hängt ein bisschen davon ab, was "Orderbymenu" ist, wie das gemacht werden soll. –

+1

Wenn es sich um eine Root-Abfrage handelt, könnte die bedingte Reihenfolge nach eine Option sein. Für verschachtelte ist es komplizierter - erfordert LinqKit oder ähnliches. Ich würde vorschlagen, 'OrderBy' /' ThenBy' zu schließen - etwas wie 'orderby orderbymenu.ISRandom? Guid.NewGuid(): Guid.Empty, orderbymenu.ISRandom? 0: menuItem.Order' :) –

0

Es scheint, dass Sie vier Datensätze aus dem Menü lesen möchten. Elemente zufällig.

Ich denke, Sie wären viel besser dran nur alle Elemente zu lesen, und dann die zufällige Auswahl später im Code im Speicher.