Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Expression.Call - Calling linq extension: FirstOrDefault, Where

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.

like image 441
Aducci Avatar asked Oct 07 '10 20:10

Aducci


People also ask

What is the use of FirstOrDefault in Linq?

FirstOrDefault<TSource>(IEnumerable<TSource>, TSource)Returns the first element of a sequence, or a specified default value if the sequence contains no elements.

What does FirstOrDefault mean?

FirstOrDefault: Returns the first element of a sequence, or a default value if no element is found. Throws exception: Only if the source is null. Use when: When more than 1 element is expected and you want only the first.

What is first and FirstOrDefault?

First. Returns the first element of a collection, or the first element that satisfies a condition. FirstOrDefault. Returns the first element of a collection, or the first element that satisfies a condition. Returns a default value if index is out of range.

What is the difference between SingleOrDefault and FirstOrDefault?

When you want a default value is returned if the result set contains no record, use SingleOrDefault. When you always want one record no matter what the result set contains, use First or FirstOrDefault. When you want a default value if the result set contains no record, use FirstOrDefault.


1 Answers

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);
like image 135
dtb Avatar answered Sep 29 '22 00:09

dtb