Я пытаюсь реализовать метод расширения, который будет работать с linq2entities. Первоначально я предполагал, что если мой метод расширения принимает и возвращает IQueryable, и пока мое выражение использует только поддерживаемые методы, то он будет работать нормально. У меня было много проблем, поэтому в крайнем случае я скопировал существующий метод расширения .NET, который, как я знал, работает (FirstOrDefault) и просто переименовал его. Казалось бы, он будет оценивать проверку «невозможно преобразовать в выражение хранилища» на основе выражения, возвращаемого из метода, а не имени самого метода.
var prs = db.People.Where(p => p.PersonKey == 15).Select(p =>
new
{
id = p.PersonKey,
name1 = p.PersonHistories.AsQueryable().AsOf().Name
}
).ToList();
Мой метод расширения, который является просто копией FirstOrDefault, которую я переименовал:
public static TSource AsOf<TSource>(this IQueryable<TSource> source)
{
return source.Provider.Execute<TSource>(Expression.Call(null, ((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(new Type[] { typeof(TSource) }), new Expression[] { source.Expression }));
}
Ошибка:
LINQ to Entities does not recognize the method
'Models.PersonHistory AsOf[PersonHistory](System.Linq.IQueryable`1[Models.PersonHistory])'
method, and this method cannot be translated into a store expression.
Как мне реализовать метод расширения IQueryable, который поддерживается в Linq2Entities?
Я действительно хочу, чтобы AsOf(source, DateTime asOf) делал что-то вроде source.FirstOrDefault
, но Я не уверен, как это сделать, чтобы он поддерживался linq2entities.
LINQKIT:Вот что я придумал, используя linqkit, и я надеюсь каким-то образом превратить это во что-то более пригодное для повторного использования:
Expression<Func<PersonHistory, bool>> IsCurrent = (p) => p.Ends > DateTime.Now && p.Starts <= DateTime.Now;
var query = db.PersonHistories.Where(IsCurrent);