Expression.Call - Calling linq extension: FirstOrDefault, Where

ぃ、小莉子 提交于 2020-01-11 08:48:22

问题


I am trying to create the following dynamically, however I am having problems calling the extension method FirstOrDefault:

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

I have the following

Expression parameter = Expression.Parameter(typeof(Engine), "e");
Expression property = Expression.Property(parameter, "Cars");
  • parameter = {e}
  • property = {e.Cars}

Those are good, but I am encountering a problem when I try and call the FirstOrDefault method:

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

I would like to get

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

but I am getting an InvalidOperationException

No generic method 'FirstOrDefault' on type 'System.Linq.Queryable' is compatible with the supplied type arguments and arguments. No type arguments should be provided if the method is non-generic.

Any help would be much appreciated.


回答1:


Are you sure e.Cars is an IQueryable<T>?

If not, you can't pass it to Queryable.FirstOrDefault<T>(IQueryable<T>).

If it's an IEnumerable<T>, change your code to call Enumerable.FirstOrDefault<T>(IEnumerable<T>):

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


来源:https://stackoverflow.com/questions/3885516/expression-call-calling-linq-extension-firstordefault-where

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!