Ich versuche, eine linq to Entity-Erweiterung-Methode zu schreiben, die eine Func verwendet, um eine Eigenschaft Id auszuwählen und es mit einer Liste von IDs zu vergleichen.Wie funktioniert ein Func in einem Ausdruck mit Linq zu Entity Framework?
Klassen
public class A
{
public int AId { get; set; }
}
public class B
{
public int BId { get; set; }
}
Erweiterungsmethode
public static IQueryable<T> WithId<T>(this IQueryable<T> entities,
Func<T, int> selector, IList<int> ids)
{
Expression<Func<T, bool>> expression = x => ids.Contains(selector(x));
return entities.Where(expression); // error here (when evaluated)
}
Methode aufrufen
var ids = new List<int> { 1, 2, 3 };
DbContext.EntityAs.WithId(e => e.AId, ids);
DbContext.EntityBs.WithId(e => e.BId, ids);
Das Problem, das ich bin Erfahren ist, dass es versucht, die Funktion aufzurufen, die in Entity Framework nicht zulässig ist.
Wie kann ich einen Eigenschaftsselektor (Func) verwenden, um die Abfrage auszuwerten?
Der Umfang des Codes, den Sie in einer EF-Abfrage aufrufen können, ist dadurch begrenzt, dass er noch in SQL übersetzt werden muss. In Ihrem Fall kann EF nicht automatisch eine IList übersetzen. –
Ich bin mir nicht sicher, dass Sie damit richtig liegen. DbContext.EntityAs.Where (e => ids.Contains (e.Id)) wird von EF korrekt übersetzt. Ich versuche nur, eine wiederverwendbare Funktion zu machen, so dass ich definieren kann, auf welcher Eigenschaft ausgewählt werden soll. – David
Da EF weiß, wie zu tun 'wählen x wo x in (1,2,3)' im Fall von aufzählbar oder 'wählen x wo x in (wählen Sie y)' im Falle einer anderen Entity-Beziehung. In Ihrem Fall müsste EF etwas wie 'select x mit x in (wählen Sie y wo F (y) in (F (1), F (2), ...))' '. Während es möglich ist, dies manuell zu tun, unterstützt EF einfach nicht die Groß-/Kleinschreibung * noch * –