代码之家  ›  专栏  ›  技术社区  ›  Aducci

expression.call-调用Linq扩展名:FirstOrDefault,其中

  •  6
  • Aducci  · 技术社区  · 14 年前

    我正在尝试动态创建以下内容,但是调用扩展方法时遇到问题 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}

    这些都很好,但是当我试着打电话给 首次违约 方法:

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

    我想买

    • 结果= {e.Cars.FirstOrDefault()}

    但我得到一个 InvalidOperationException

    上没有泛型方法“FirstOrDefault” 类型“system.linq.queryable”是 与提供的类型兼容 论点和论点。没有类型 如果 方法不是泛型。

    任何帮助都将不胜感激。

    1 回复  |  直到 6 年前
        1
  •  12
  •   dtb    14 年前

    你确定吗? e.Cars 是一个 IQueryable<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);