2010-10-07 13 views
5

Dinamik aşağıdaki oluşturmaya çalışıyorum, ancak benExpression.Call - çağrılması linq uzantısı: FirstOrDefault,

Expression parameter = Expression.Parameter(typeof(Engine), "e"); 
Expression property = Expression.Property(parameter, "Cars"); 
aşağıdakilere sahip uzatma yöntemi "FirstOrDefault"

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

arayarak sorun yaşıyorum

  • parametre = {e}
  • özelliği = {e.Cars}

olanlar iyi, ama ben FirstOrDefault yöntemini

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

denemek ve demenden bir sorunla karşılaşmak ediyorum ben almak istiyorum

  • sonuç = {e.Cars.FirstOrDefault()}

ama bir InvalidOperationException

alıyorum

türünde 'System.Linq.Queryable' türünde 'FirstOrDefault' türü, türünde argümanları ve bağımsız değişkenleri ile uyumludur. yöntemi jenerik değilse, türünde hiçbir bağımsız değişken sağlanmalıdır.

Herhangi bir yardım çok takdir edilecektir.

Teşekkürler. Adam

+0

sen açıklık getirebilir? FirstOrDefault, * genellikle * lambda'nın bir parçası değildir, bu nedenle İfade –

+0

ile dahil edilmesine gerek yoktur. Amacım bir lamda içinde bir lamda oluşturmaktır, bu yüzden böyle bir şey: .Where (e => e.Cars .Where (c => c.Name == "Honda").> 0) Bu bir şeyi açıklığa kavuşturuyor mu yoksa kafam karıştı mı? – Aducci

cevap

11

e.Cars'un IQueryable<T> olduğundan emin misiniz?

Değilse, Queryable.FirstOrDefault<T>(IQueryable<T>)'a iletemezsiniz. bir IEnumerable<T> ise

, kodunuz Enumerable.FirstOrDefault<T>(IEnumerable<T>) aramaya değiştirin:

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

Teşekkürler şimdi çalışıyor. Araba Türünü özellik ifadesinden almak için bir yol olup olmadığını biliyor musunuz? – 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

mükemmel çalışıyor That. Yardımın için teşekkürler, gerçekten takdir ediyorum. – Aducci