Próbuję napisać linq do metody rozszerzenia encji, która ma Func, aby wybrać identyfikator nieruchomości i porównać go z listą identyfikatorów.Jak używać Func w wyrażeniu z Linq do Entity Framework?
Klasy
public class A
{
public int AId { get; set; }
}
public class B
{
public int BId { get; set; }
}
Extension Metoda
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)
}
wywołanie metody
var ids = new List<int> { 1, 2, 3 };
DbContext.EntityAs.WithId(e => e.AId, ids);
DbContext.EntityBs.WithId(e => e.BId, ids);
Problem Jestem doświadczanie polega na tym, że próbuje wywołać funkcję, która nie jest dozwolona w Entity Framework.
Jak mogę użyć selektora właściwości (Func) do oceny zapytania?
Zakres kodu, który można wywołać w zapytaniu EF, jest ograniczony przez fakt, że nadal wymaga przetłumaczenia w SQL. W twoim przypadku EF nie wie, jak tłumaczyć ILista automatycznie. –
Nie jestem pewien, czy masz rację. DbContext.EntityAs.Where (e => ids.Contains (e.Id)) jest poprawnie przetłumaczony przez EF. Po prostu próbuję utworzyć funkcję wielokrotnego użytku, aby móc określić, którą właściwość wybrać. – David
Ponieważ EF wie, jak to zrobić: "wybierz x, gdzie x in (1,2,3)' w przypadku przeliczalnych lub 'wybierz x, gdzie x in (wybierz y)' w przypadku innej relacji encji. W twoim przypadku EF musiałby skompilować coś w stylu 'wybierz x gdzie x in (wybierz y gdzie F (y) w (F (1), F (2), ...))'. Chociaż można to zrobić ręcznie EF nie obsługuje tylko przypadku * jeszcze * –