views:

45

answers:

1

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.

Thanks. Adam

+2  A: 

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);
dtb
Thanks it works now. Do you know if there is a way to get the Car Type from the property expression?
Aducci
@Aducci: [TypeSystem.GetElementType](http://blogs.msdn.com/b/mattwar/archive/2007/07/30/linq-building-an-iqueryable-provider-part-i.aspx) ( [property.Type](http://msdn.microsoft.com/en-us/library/system.linq.expressions.expression.type.aspx) )
dtb
@dtb: That works perfectly. Thanks for your help, I really appreciate it.
Aducci