2010-10-07 8 views
5

Próbuję utworzyć następujące dynamicznie, jednak mam problemy z wywołaniem metody rozszerzenie "FirstOrDefault"Expression.Call - Calling rozszerzenie LINQ: FirstOrDefault Gdzie

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

Mam następujący

Expression parameter = Expression.Parameter(typeof(Engine), "e"); 
Expression property = Expression.Property(parameter, "Cars"); 
  • parametr = {e}
  • właściwość = {e.Cars}

Są dobre, ale ja napotykają problem, gdy próbuję i wywołać metodę FirstOrDefault

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

Chciałbym dostać

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

ale jestem coraz InvalidOperationException

Brak ogólnej metody "FirstOrDefault" na typ "System.Linq.Queryable" jest kompatybilny z dostarczonymi argumentami i argumentami typu: . Nie należy podawać argumentów typu , jeśli metoda nie jest generyczna.

Każda pomoc będzie bardzo cenna.

Dzięki. Adam

+0

Czy możesz wyjaśnić? FirstOrDefault nie jest * zwykle * częścią lambda, więc nie musi być zaangażowany w Expression –

+0

Moim celem jest stworzenie lambda wewnątrz lamda, więc coś takiego: .Where (e => e.Cars .Where (c => c.Name == "Honda"). Count> 0) Czy to coś wyjaśnia lub jestem zdezorientowany? – Aducci

Odpowiedz

11

Czy jesteś pewien, że e.Cars to IQueryable<T>?

Jeśli nie, nie możesz przekazać go do Queryable.FirstOrDefault<T>(IQueryable<T>).

Jeśli jest to IEnumerable<T>, zmień kod zadzwonić Enumerable.FirstOrDefault<T>(IEnumerable<T>):

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

Dzięki to działa teraz. Czy wiesz, czy istnieje sposób na uzyskanie typu samochodu z wyrażenia właściwości? – 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

To działa idealnie. Dzięki za pomoc, naprawdę to doceniam. – Aducci

Powiązane problemy