2016-08-11 2 views
0

Betrachten Sie die Funktion:leer Lambda-Ausdruck erstellen

public async Task<IEnumerable<Purchases>> GetPurchases(User user, Expression<Func<Purchases, bool>> whereClause) 
    {   
      using (var context = new UserDbContext()) 
      { 
       context.Users.Attach(user); 
       context.Entry(user).Collection(p => p.Purchases) 
       .Query() 
       .Where(whereClause) 
       .Load(); 

       if (Equals(user.Purchases, null)) 
        return new List<Purchases>(); 
      } 

     return user.Purchases; 
} 

In dieser Funktion die Parameter Whereclause manchmal null sein kann, ich bin zu wollen, wenn sein null prüfen und dann einen leeren Ausdruck zuweisen, wenn so. Das ist so nah wie ich gekommen bin:

if (Equals(whereClause, null)) 
     whereClause =() => { }; 

Dies wurde auf der Grundlage der Frage here, sondern auch für die Linie, die macht Whereclause leer Ich bin den Fehler.

Fehler 7 Nicht alle Codepfade einen Wert zurückgeben in Lambda-Ausdruck vom Typ 'System.Func' < 'Käufe, bool>'

Wer weiß, wie dies korrigiert werden?

Antwort

4

"Nicht alle Codepfade geben einen Wert zurück" bedeutet, dass Ihr Lambda nichts zurückgibt. Ich meine, es hat nur einen Code-Pfad, und es ist nicht lange.

Where requires a lambda which takes one parameter, and returns bool. Where wird nicht lassen Sie geben Sie einen leeren Lambda-Ausdruck.

Sie müssen etwas geben, mit dem Sie Elemente filtern können.

, die eigentlich einfach ist:

if (Equals(whereClause, null)) 
    whereClause = o => true; 

dass eine ist, wo Klausel, die immer true zurückgibt, unabhängig davon, was Sie ihm geben. Das ist wahrscheinlich, was du willst: Wenn es keinen Filter gibt, füge alles ein. Für jedes Element in der Aufzählung gibt eins nach dem anderen Where dem Lambda das Element o. Wenn das Lambda true zurückgibt, enthält es den Wert o in den Ergebnissen.

Wenn Sie ein Null-Filter keine Artikel zurück, nur false zurück statt:

if (Equals(whereClause, null)) 
    // Whatever it is, I'm against it. 
    whereClause = o => false; 
+0

Yessir! Perfecto. –

1

whereClause muss einen Booleschen Wert zurück in LinQs Where Methode zu verwenden.

Angenommen, Sie nicht über die Liste filtern möchten (einschließlich aller Artikel) Sie müssen true zurückkehren, sonst false:

if (Equals(whereClause, null)) 
    whereClause =() => true; 

Hinweis: Die { und } nicht notwendig sind, wenn Sie nur einen Wert zurückgeben mit eine einzelne Aussage.

Aber Sie sollten wissen, dass die meisten Framework-Methoden nicht auf diese Weise funktionieren. Sie würden einen ArgumentNullException werfen, anstatt einen Wert zu setzen.

1

Angenommen, wenn whereClause Null ist, möchten Sie keinen Filter anwenden.

 using (var context = new UserDbContext()) 
     { 
      context.Users.Attach(user); 
      context.Entry(user).Collection(p => p.Purchases) 
      .Query() 
      .Where(whereClause ?? p => true) 
      .Load(); 

      if (Equals(user.Purchases, null)) 
       return new List<Purchases>(); 
     }