Mam dwie metody rozszerzenie jak tenLINQ to Entities nie obsługuje metody rozszerzenia?
public static IQueryable<T> CurrentVersion(this IQueryable<T> queryable, DateTime date)
{
return queryable.Where(p => p.CreationDate>date);
}
public static IEnumerable<T> CurrentVersion(this IEnumerable<T> queryable, DateTime date)
{
return queryable.Where(p => p.CreationDate>date);
}
mój model jest
public class Group {
..
ICollection<GroupMembers> GroupMembers { get; set; }
}
Podczas korzystania z metody wydłużania się tego zapytania wszystko jest ok
var q = Db.Groups.CurrentVersion();
var result = q.ToList();
Ale kiedy go używać w przepływie zapytania pojawia się błąd
var q = Db.Groups.SelectMany(p => p.GroupMembers.AsQueryable().CurrentVersion(date));
OR
var q = Db.Groups.SelectMany(p => p.GroupMembers.AsEnumerable().CurrentVersion(date));
var result = q.ToList(); // Here I get error
Błąd:
LINQ to Entities does not recognize the method 'System.Linq.IQueryable
1[..](System.Linq.IQueryable
1[..., System.DateTime)' method, and this method cannot be translated into a store expression.
Teraz mam dwa pytania:
google ten błąd i znalazł wiele problemów, tak samo jak moje pytanie w stackoverflow. Wszystkie odpowiedzi brzmiały "Od Linq do Entities nie można przekonwertować tej metody rozszerzenia na zapytanie SQL". Teraz byłbym wdzięczny, gdyby ktoś mi pomógł wiedzieć, dlaczego moje pierwsze zapytanie nie powoduje żadnych błędów?
Jak zmienić metodę rozszerzenia, która może zostać rozpoznana przez Linq-to-Entities?
Myślę, że twoje rozszerzenie nie różni się od mojej metody rozszerzenia, ponieważ queryable.Where (ExpressionsHelper.CurrentVersion (data)) jest równe z queryable.Where (p => p.CreationDate> date); –
Rzeczywiście queryable.Where (ExpressionsHelper.CurrentVersion (date)) powinny działać jako queryable.Where (p => p.CreationDate> date); ale to był cel, prawda? Zmieniłem twoją metodę, aby logika filtrowania mogła zostać ponownie użyta, jak chcesz. Różnica polega na tym, że proponowana przeze mnie metoda działa, a EF może ją sparsować. – mr100
Ale mojej wersji metody rozszerzenia CurrentVersion nie można zastosować do zagnieżdżonego zapytania! Możesz go używać tylko z prostymi zapytaniami, takimi jak Db.Groups.Obecna wersja(); Dla złożonych musisz użyć Db.Groups.SelectMany (p => p.GroupMembers.AsQueryable(). Gdzie (ExpressionsHelper.CurrentVersion (date))); Metoda rozszerzenia jest prezentowana tylko jako próbka - jeśli chcesz ją mieć, możesz ją mieć bez duplikowania kodu. – mr100