问题
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