У меня есть два метода расширения, как этотLINQ to Entities не поддерживает метод расширения?
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);
}
Моя модель
public class Group {
..
ICollection<GroupMembers> GroupMembers { get; set; }
}
Когда я использую от метода расширения в этом запросе все нормально
var q = Db.Groups.CurrentVersion();
var result = q.ToList();
Но когда я использую его in flowing query Я получаю ошибку
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
Ошибки:
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.
Теперь у меня есть два вопроса:
Я гугл этой ошибки и нашел много проблем, так же, как мой вопрос в StackOverflow. Все ответы были: «Linq to Entities не может преобразовать этот метод расширения в SQL-запрос». Теперь я был бы признателен, если кто-нибудь поможет мне узнать, почему мой первый запрос не вызывает никаких ошибок?
Как изменить метод расширения, который может быть распознан Linq-to-Entities?
Я думаю, что ваше расширение не отличается от моего метода расширения, потому что queryable.Where (ExpressionsHelper.CurrentVersion (date)) является equale с запросом. Где (p => p.CreationDate> date); –
Действительно queryable.Where (ExpressionsHelper.CurrentVersion (date)) должен работать как queryable.Where (p => p.CreationDate> date); но это была цель, не так ли? Я изменил свой метод, чтобы ваша логика фильтрации могла быть повторно использована, как вы это делали. Поэтому разница должна заключаться в том, что метод, предложенный мной, работает, и EF может разобрать его на запрос. – mr100
Но моя версия метода расширения CurrentVersion не может быть применена к вашему вложенному запросу! Вы можете использовать его только с помощью простых запросов, таких как Db.Groups.Текущая версия(); Для сложных нужно использовать Db.Groups.SelectMany (p => p.GroupMembers.AsQueryable(). Где (ExpressionsHelper.CurrentVersion (дата))); Метод расширения представлен только как образец - если вы хотите его использовать, вы можете получить его без дублирования кода. – mr100