2010-10-07 27 views
5

tôi đang cố gắng để tạo ra sau động, tuy nhiên tôi đang gặp vấn đề gọi phương thức mở rộng "FirstOrDefault"Expression.Call - Kêu gọi mở rộng LINQ: FirstOrDefault, đâu

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

Tôi đã sau

Expression parameter = Expression.Parameter(typeof(Engine), "e"); 
Expression property = Expression.Property(parameter, "Cars"); 
  • tham số = {e}
  • tài sản = {} e.Cars

Đó là tốt, nhưng tôi đang gặp phải một vấn đề khi tôi cố gắng và gọi phương thức FirstOrDefault

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

Tôi muốn để có được

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

nhưng tôi nhận được một InvalidOperationException

Không có phương pháp chung 'FirstOrDefault' trên loại 'System.Linq.Queryable' là tương thích với kiểu được cung cấp đối số và đối số. Không cần loại đối số nếu phương pháp không chung chung.

Mọi trợ giúp sẽ được đánh giá cao.

Cảm ơn. Adam

+0

Bạn có thể làm sáng tỏ? FirstOrDefault không phải là * thường là * một phần của lambda, vì vậy không cần phải tham gia với Expression –

+0

Mục tiêu của tôi là tạo một lambda bên trong một lamda, vì vậy một cái gì đó như thế này: . Where (e => e.Cars .Where (c => c.Name == "Honda") Đếm> 0) Điều đó làm rõ bất cứ điều gì hay tôi bối rối? – Aducci

Trả lời

11

Bạn có chắc chắn e.CarsIQueryable<T> không?

Nếu không, bạn không thể chuyển nó đến Queryable.FirstOrDefault<T>(IQueryable<T>).

Nếu nó là một IEnumerable<T>, thay đổi mã của bạn để gọi Enumerable.FirstOrDefault<T>(IEnumerable<T>):

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

Cảm ơn nó hoạt động ngay bây giờ. Bạn có biết nếu có cách nào để lấy Loại Xe từ biểu thức thuộc tính không? – 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

Điều đó hoạt động hoàn hảo. Cảm ơn sự giúp đỡ của bạn, tôi thực sự đánh giá cao nó. – Aducci

Các vấn đề liên quan