Expression.Call - 调用linq扩展名:FirstOrDefault,Where

时间:2010-10-07 20:13:23

标签: c# linq expression dynamic predicate

我正在尝试动态创建以下内容,但是在调用扩展方法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");
  • parameter = {e}
  • property = {e.Cars}

这些都很好,但是当我尝试调用FirstOrDefault方法时遇到问题:

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

我想得到

  • result = {e.Cars.FirstOrDefault()}

但我得到InvalidOperationException

  

没有通用方法'FirstOrDefault'   类型'System.Linq.Queryable'是   与提供的类型兼容   参数和论点。没有类型   如果是,应提供参数   方法是非通用的。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:12)

您确定e.CarsIQueryable<T>吗?

如果没有,则无法将其传递给Queryable.FirstOrDefault<T>(IQueryable<T>)

如果是IEnumerable<T>,请更改您的代码以致电Enumerable.FirstOrDefault<T>(IEnumerable<T>)

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