Angenommen, ich habe ein Entitätsobjekt, das als
public partial class Article
{
public Id
{
get;
set;
}
public Text
{
get;
set;
}
public UserId
{
get;
set;
}
}
Anhand einiger Eigenschaften eines Artikels muss ich feststellen, ob der Artikel von einem bestimmten Benutzer gelöscht werden kann. Also füge ich eine statische Methode hinzu, um die Überprüfung durchzuführen. Etwa so:
public partial class Article
{
public static Expression<Func<Article, bool>> CanBeDeletedBy(int userId)
{
//Add logic to be reused here
return a => a.UserId == userId;
}
}
Jetzt kann ich also
using(MyEntities e = new MyEntities())
{
//get the current user id
int currentUserId = 0;
e.Articles.Where(Article.CanBeDeletedBy(currentUserid));
}
So weit, so gut. Jetzt möchte ich die Logik in CanBeDeletedBy wiederverwenden, während ich ein Select mache, etwa so:
using(MyEntities e = new MyEntities())
{
//get the current user id
int currentUserId = 0;
e.Articles.Select(a => new
{
Text = a.Text,
CanBeDeleted = ???
};
}
Aber egal, was ich versuche, ich kann den Ausdruck nicht in der Select-Methode verwenden. Ich vermute, dass wenn ich tun kann
e.Articles.Select(a => new
{
Text = a.Text,
CanBeDeleted = a => a.UserId == userId
};
Dann sollte ich in der Lage sein, denselben Ausdruck zu verwenden. Ich habe versucht, den Ausdruck zu kompilieren und ihn aufzurufen, indem ich
e.Articles.Select(a => new
{
Text = a.Text,
CanBeDeleted = Article.CanBeDeletedBy(currentUserId).Compile()(a)
};
aber auch das wird nicht funktionieren.
Haben Sie eine Idee, wie man das zum Laufen bringen kann? Oder wenn das nicht möglich ist, welche Alternativen gibt es, um die Geschäftslogik an beiden Stellen wiederzuverwenden?
Danke
Pedro
0 Stimmen
Die Kompilierung des Ausdrucks ist die richtige Wahl, und sie funktioniert auch bei mir. An meiner Stelle würde ich auch die Kompilierung ausschließen. Welche Fehlermeldung erhalten Sie?
0 Stimmen
Ja, es kompiliert gut, aber wirft eine NotSupportedException Ausnahme: "Der LINQ-Ausdrucksknotentyp 'Invoke' wird in LINQ to Entities nicht unterstützt." Ich habe versucht, den Ausdruck außerhalb von Select in einen Func<Artikel,bool> zu kompilieren und ihn innerhalb zu verwenden, mit demselben Ergebnis.
0 Stimmen
Btw, wenn ich eine einfache Func<Artikel, bool>, und verwenden Sie es in der Where-Methode, dann wird die Abfrage auf dem Client ausgeführt werden, die nicht den beabsichtigten Zweck ist.
0 Stimmen
Ah, sorry, mein Fehler - übersehen die Tatsache, dass Sie EF verwenden - es funktioniert gut mit Linq zu Objekten :)