Метод расширения IQueryable для linq2entities

Я пытаюсь реализовать метод расширения, который будет работать с 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(s => s.EndDate > asOf && asOf >= s.StartDate ), но Я не уверен, как это сделать, чтобы он поддерживался linq2entities.

LINQKIT:Вот что я придумал, используя linqkit, и я надеюсь каким-то образом превратить это во что-то более пригодное для повторного использования:

Expression<Func<PersonHistory, bool>> IsCurrent = (p) => p.Ends > DateTime.Now && p.Starts <= DateTime.Now;
var query = db.PersonHistories.Where(IsCurrent);
  1. Иметь более глобально объявленное выражение вместо локального Переменная.
  2. Добавьте параметр DateTime asOf вместо жестко закодированного .Now.
  3. И, если возможно, адаптируйте его в метод расширения (такой вид такой же, как № 1, только метод расширения является идеальным.
6
задан AaronLS 31 May 2012 в 20:16
поделиться