Frage

Ich hätte gerne eine Methode mit der folgenden API:

//get all users with a role of admin
var users = myRepository.GetUsers(u => u.Role == Role.Admin);

Wird so etwas so funktionieren?

IList<User> GetUsers(Func<User, bool> predicate)
{            
  var users = GetAllUsers();
  return users.Where(predicate).ToList();                                                          
} 

Wenn ja, kann ich komplexere Prädikate wie (z.Pseudocode):

myRepository.GetUsers(u => u.CreatedDate is upto 14 days old);
War es hilfreich?

Lösung

Das sieht absolut in Ordnung aus. Wenn Sie das Prädikat jedoch mit so etwas wie Linq zu SQL verwenden möchten, möchten Sie verwenden:

IList<User> GetUsers(Expression<Func<User, bool>> predicate)

Das bedeutet, dass der Lambda -Ausdruck in einen Ausdrucksbaum anstelle eines Delegiertens umgewandelt wird - und dieser Ausdrucksbaum kann dann in SQL umgewandelt werden.

Andere Tipps

Ja, das wird funktionieren.

Was Sie dem Compiler sagen, ist, dass Sie eine Funktion übergeben, die auf einem funktioniert User Objekt und gibt a zurück bool - Wie die Funktion aussieht, liegt ganz bei Ihnen. Sie können mit ORS (||) und und (&&) auch, aber wenn es zu schwer zu sehen ist, was das Prädikat tut, sollten Sie wahrscheinlich in Betracht ziehen.

Aber im Grunde alle Lambda, die zum Beispiel dauert u Als ein User Objekt und verwandelt es in einen Ausdruck, der zurückkommt bool wird funktionieren.

Ein Tipp: Sie können Prädikat verwendenu003CT> anstelle von funcu003CT, bool> , was etwas klarer ist (Prädikatu003CT> ist in .NET 3.5, Namespace -System) eingebaut.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top