Expression.Call - вызов расширения linq: FirstOrDefault, где - PullRequest
6 голосов
/ 08 октября 2010

Я пытаюсь создать следующее динамически, однако у меня возникают проблемы с вызовом метода расширения FirstOrDefault:

 using(var context = new Entities())
 {
     var list = context.Engines.Include("Cars").Select(e => e.Cars.FirstOrDefault()).ToList();
 }

У меня есть следующее

Expression parameter = Expression.Parameter(typeof(Engine), "e");
Expression property = Expression.Property(parameter, "Cars");
  • параметр = {e}
  • свойство = {e.Cars}

Это хорошо, но я сталкиваюсь с проблемой, когда пытаюсь вызвать метод FirstOrDefault:

var result = Expression.Call(typeof(Queryable), "FirstOrDefault", new type[] { typeof(Car)}, property);

Я бы хотел получить

  • результат = {e.Cars.FirstOrDefault()}

но я получаю InvalidOperationException

Нет общего метода 'FirstOrDefault' в Тип 'System.Linq.Queryable' является совместим с поставляемым типом аргументы и аргументы. Нет типа аргументы должны быть предоставлены, если Метод не является универсальным.

Любая помощь будет принята с благодарностью.

1 Ответ

12 голосов
/ 08 октября 2010

Вы уверены, что e.Cars является IQueryable ?

Если нет, его нельзя передать Queryable.FirstOrDefault (IQueryable ) .

Если это IEnumerable , измените свой код на вызов Enumerable.FirstOrDefault (IEnumerable ) :

 var result =
     Expression.Call(
         typeof(Enumerable),
         "FirstOrDefault",
         new Type[] { TypeSystem.GetElementType(property.Type) },
         property);
...