2013-06-17 20 views
7

Ich bin Wunder, wenn jemand weiß, wie man in Entity Framework zum Ausdruck bringen, was es in reinen SQL sein wird:Entity Framework OrderBy "CASE WHEN"

SELECT Name, IsEmployee, IsQualityNetwork 
FROM Person 
ORDER BY CASE WHEN IsQualityNetwork = 1 or IsEmployee = 1 THEN 0 ELSE 1 END, Name 

Ich habe versucht, Linq Dynamische verwenden, aber wenn dieser Code ausgeführt wird:

var p = ctx.People 
    .OrderBy("CASE WHEN IsQualityNetwork = 1 or IsEmployee = 1 THEN 0 ELSE 1 END") 
    .OrderBy(e => e.Name); 

ich bekomme die Ausnahme: { "Keine Eigenschaft oder ein Feld 'CASE' existiert in Typ 'Person'"}

Antwort

6
var p = ctx.People.OrderBy(p => (p.IsQualityNetwork == 1 || p.IsEmployee == 1) ? 0 : 1) 
        .ThenBy(p => p.Name); 
1

Hier ist eine Übersetzung Ihrer SQL in LINQ.

var query = from p in ctx.People 
      let order = p.IsQualityNetwork || p.IsEmployee ? 0 : 1 
      orderby order, p.Name 
      select new 
      { 
       p.Name, 
       p.IsEmployee, 
       p.IsQualityNetwork, 
      } 

Ich habe die fließend Abfragesyntax so habe ich Ihnen die let Stichwort zeigen konnte. let können Sie eine Bereichsvariable deklarieren, die dann in Ihrer Abfrage wiederverwendet werden kann. Dies kann sehr nützlich sein, wenn Sie eine Bedingung haben, die an vielen Stellen verwendet wird, oder wenn Sie mehrere Bedingungen verketten müssen.