Angenommen, ich habe ein Objekt Einheit alsWiederverwenden von Linq to Entities' Expression <Func <T, TResult> in Auswählen und Wo ruft
definiertpublic partial class Article
{
public Id
{
get;
set;
}
public Text
{
get;
set;
}
public UserId
{
get;
set;
}
}
Basierend auf einigen Eigenschaften eines Artikels, muss ich kann, wenn der Artikel bestimmen, gelöscht werden von einem bestimmten Benutzer. Also füge ich eine statische Methode hinzu, um die Überprüfung durchzuführen. Etwas wie:
public partial class Article
{
public static Expression<Func<Article, bool>> CanBeDeletedBy(int userId)
{
//Add logic to be reused here
return a => a.UserId == userId;
}
}
So, jetzt kann ich
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 wieder zu verwenden, während eine Auswahl zu tun, so etwas wie:
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 nicht den Ausdruck in der select-Methode verwenden. Ich denke, wenn ich kann
e.Articles.Select(a => new
{
Text = a.Text,
CanBeDeleted = a => a.UserId == userId
};
Dann sollte ich in der Lage sein, den gleichen Ausdruck zu verwenden. Versucht, den Ausdruck zu kompilieren und ihn aufzurufen
aber es wird auch nicht funktionieren.
Irgendwelche Ideen, wie man das zum Laufen bringt? Oder wenn es nicht möglich ist, welche Alternativen gibt es, um die Geschäftslogik an beiden Orten wiederzuverwenden?
Dank
Pedro
Das Zusammenstellen des Ausdrucks ist die richtige Wahl und es kompiliert und funktioniert für mich. Wenn ich es wäre, würde ich auch die Zusammenstellung herausrechnen. Welchen Fehler bekommst du? –
Ja, es kompiliert einwandfrei, löst aber eine NotSupportedException-Ausnahme aus: "Der LINQ-Ausdrucksknotentyp 'Invoke' wird in LINQ to Entities nicht unterstützt." Versucht, den Ausdruck außerhalb des Select in einen Func zu kompilieren und ihn mit demselben Ergebnis zu verwenden. –
Pedro
Übrigens, wenn ich einen einfachen Func benutze und ihn in der Wobei Methode, dann wird die Abfrage auf dem Client ausgeführt, was nicht der beabsichtigte Zweck ist –
Pedro