2010-10-07 6 views
5

Sto cercando di creare la seguente modo dinamico, però ho dei problemi chiamando il metodo estensione "FirstOrDefault"Expression.Call - Calling estensione LINQ: FirstOrDefault, dove

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

Ho il seguente

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

Quelli sono buoni, ma io sto incontrando un problema quando cerco e chiamo il metodo FirstOrDefault

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

Vorrei ottenere

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

ma sto ottenendo un InvalidOperationException

Nessun metodo generico 'FirstOrDefault' su tipo 'System.Linq.Queryable' è compatibile con gli argomenti e gli argomenti del tipo fornito. Non è necessario fornire gli argomenti di tipo se il metodo non è generico.

Qualsiasi aiuto sarebbe molto apprezzato.

Grazie. Adam

+0

Può chiarire? FirstOrDefault non è * di solito * parte del lambda, quindi non è necessario essere coinvolto con Expression –

+0

Il mio obiettivo è creare un lambda all'interno di una lamda, quindi qualcosa di simile: . Dove (e => e.Cars Dove (c => c.Nome == "Honda"). Conta> 0) Questo chiarisce qualcosa o sono confuso? – Aducci

risposta

11

Sei sicuro che e.Cars è un IQueryable<T>?

In caso contrario, non è possibile passare a Queryable.FirstOrDefault<T>(IQueryable<T>).

Se è un IEnumerable<T>, modificare il codice per chiamare Enumerable.FirstOrDefault<T>(IEnumerable<T>):

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

Grazie funziona ora. Sai se esiste un modo per ottenere il Car Type dall'espressione della proprietà? – Aducci

+1

@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

+1

Ciò funziona perfettamente. Grazie per il tuo aiuto, lo apprezzo davvero. – Aducci