2016-05-06 28 views
1

Mit Entity Framework C# und diese Abfrage haben, muss ich den Teil, wo es heißt:Entity Framework Gebäude Where-Klausel on the fly mit Expression

where x.Login_Status == "Submitted" 

dynamisch. Es gibt verschiedene Fälle, in denen es "Submitted" oder null oder etwas anderes sein könnte und anstatt mehrere if-Anweisungen mit verschiedenen Abfragen darin zu schreiben, möchte ich ein Prädikat in einer where-Klausel haben.

status = (from x in ctx.table 
      where x.Login_Status == "Submitted" 
      orderby x.SUB_DATE descending 
      select new Model_Table() 
      { 
       Id = x.ID, 
       Name = x.NAME, 
       Code = x.Code, 
       DateSubmitted = x.SUB_DATE 
      }).ToList<Model_Table>(); 

Ist das möglich?

Lösung:

Innerhalb der if-Anweisung, wenn mehrere Parameter verwenden diese

where_expression = x => x.Login_Status == "Submitted" || x.Login_Status == null; 

Dies ist die komplette Code festgestellt, die für mich gearbeitet, etwas eckigen Klammern ersetzen Sie den Code anpassen:

Expression<Func<[Replace with your Entity], bool>> where_submitted = x => x.Login_Status == "Submitted"; 

// Check if all selected 
if (CheckBox_Show_All_Submitted.Checked) 
{ 
    where_submitted = x => x.Login_Status == "Submitted" || x.Login_Status == null; 
} 

status = 
    ctx.[Replace with your Entity Table] 
    .Where(where_submitted) 
    .OrderByDescending(x => x.SUB_DATE) 
    .Select(x => new Model_Table 
     { 
      Id = x.ID, 
      Name = x.NAME, 
      Code = x.Code, 
      DateSubmitted = x.SUB_DATE 
     }).ToList<Model_Table>(); 
+0

Sie eine bitweise ENUM nutzen könnten, und verwenden Sie [Enum.HasFlag ] (https://msdn.microsoft.com/en-us/library/system.enum.hasflag%28v=vs.110%29.aspx) (das berücksichtigt den Null-Fall nicht wirklich). –

+0

meine Antwort auf eine ähnliche Frage Siehe: http://stackoverflow.com/a/34098534/1677829 – Lunyx

+0

Sie einen Ausdruck benötigen, kein Prädikat. –

Antwort

2

Sie benötigen eine Expression<Func<Entity,bool>>, keine Predicate<Entity>. Der Unterschied besteht darin, dass ein Prädikat ein kompilierter Delegat ist und ein Ausdruck Code als Daten ist und somit in SQL übersetzt werden kann. Hier

ein Beispiel:

//You can have this expression have different values based on your logic 
Expression<Func<Entity,bool>> where_expression = x => x.Login_Status == "Submitted"; 

var query = 
    ctx.Table 
    .Where(where_expression) 
    .OrderByDescending(x => x.SUB_DATE) 
    .Select(x => new Model_Table()) 
    { 
     Id = x.ID, 
     Name = x.NAME, 
     Code = x.Code, 
     DateSubmitted = x.SUB_DATE 
    }).ToList();   

Bitte beachten Sie, dass Sie Entity mit dem Namen der realen Klasse ersetzen müssen.

+0

Das hilft wirklich. Es gibt ein kleines Problem. Wenn Sie diesen Ausdruck verwenden Ausdruck > where_Ausdruck = x => x.Login_Status == "Eingereicht"; Es gilt nur für die Werte "Submitted", aber ich muss sowohl "Submitted" als auch "NULL" haben. –

+0

Sie können jede Bedingung in dem Ausdruck haben. Z.B. Sie können 'x => x.Login_Status ==" Eingereicht "|| haben x.Login_Status == null'. –

-1

Erstellen Sie eine Erweiterungsmethode für IQueryable wie folgt aus:

public static class MethodExtensions{ 

     public static IEnumerable<Model_Table> Query(this IQueryable<TEntity> source, string data){ 
      return (from x in source 
      where x.Login_Status == data 
      orderby x.SUB_DATE descending 
      select new Model_Table() 
      { 
       Id = x.ID, 
       Name = x.NAME, 
       Code = x.Code, 
       DateSubmitted = x.SUB_DATE 
      }).ToList<Model_Table>(); 
     } 
} 

Jetzt können Sie es wie folgt verwenden:

var result = ctx.table.Query("somethingelse"); 
+0

OP verwendet das Entity Framework, so dass 'ctx.table' vom Typ' IQueryable 'ist. –

+0

Wenn verwendet ef die Tische sind DbSet Wich implementiert IEnumerable , IQueryable ... – aff

+0

Richtig. Aber wenn Sie 'IEnumerable ' verwenden, wird der gesamte Inhalt der Tabelle abgefragt und im Speicher gespeichert, und 'Where' und' OrderBy' werden im Speicher ausgeführt. Ich möchte damit sagen, dass Ihre Erweiterungsmethode "IQueryable " akzeptieren sollte, so dass die Abfrage auf der Datenbankseite erfolgt, nicht im Speicher. –