Sto provando a scrivere un linq al metodo di estensione dell'entità che accetta un Func per selezionare un ID di proprietà e confrontarlo con un elenco di id.Come utilizzare un Func in un'espressione con Linq su Entity Framework?
Classi
public class A
{
public int AId { get; set; }
}
public class B
{
public int BId { get; set; }
}
Metodo di estensione
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)
}
metodo di chiamata
var ids = new List<int> { 1, 2, 3 };
DbContext.EntityAs.WithId(e => e.AId, ids);
DbContext.EntityBs.WithId(e => e.BId, ids);
Il problema che sto sperimentare è che sta cercando di richiamare la funzione che non è consentita in Entity Framework.
Come è possibile utilizzare un selettore di proprietà (Func) per valutare la query?
L'ambito del codice che è possibile richiamare in una query EF è limitato dal fatto che deve ancora essere tradotto in SQL. Nel tuo caso EF non sa come tradurre un IList automaticamente. –
Non sono sicuro che tu abbia ragione con quello. DbContext.EntityAs.Where (e => ids.Contains (e.Id)) è tradotto correttamente da EF. Sto solo cercando di fare una funzione riutilizzabile, così posso definire su quale proprietà selezionare. – David
Poiché EF sa come fare 'selezionare x dove x in (1,2,3)' nel caso di enumerable o 'select x dove x in (select y)' nel caso di un'altra relazione di entità. Nel tuo caso EF dovrebbe compilare qualcosa come 'select x dove x in (seleziona y dove F (y) in (F (1), F (2), ...))'. Mentre è possibile farlo manualmente, EF non supporta il caso * ancora * –