2012-12-03 20 views
5

Tôi muốn chuyển biểu thức lambda động vào hàm bên dưới, nhưng tôi không chắc chắn cách xác định .Take() hoặc .OrderByDescending() trên đối tượng biểu thức. Nếu tôi muốn gọi hàm dưới, sau đó tôi muốn để có thể làm điều này:Làm cách nào để xác định TOP CHỌN bằng LINQ với truy vấn động?

dbprovider.Query = (x => x.ConfigurationReference == "172.16.59.175") 
        .Take(100) 
        .OrderByDescending(x.Date) 
FindEntities(db, dbprovider.Query) 

Nhưng tôi không thể (cú pháp này là không hợp lệ). Bất kỳ ý tưởng?

public static List<T> FindEntities<T>(TrackingDataContext dataContext, System.Linq.Expressions.Expression<Func<T, bool>> find) where T : class 
{ 
    try 
    { 
     var val = dataContext.GetTable<T>().Where(find).ToList<T>(); 
     return val; 
    } 
    catch (Exception ex) 
    { 
     throw ex; 
    } 
} 
+1

xử lý ngoại lệ của bạn đạt được gì hữu ích, btw, và không làm một số điều xấu (nó sẽ mất stacktrace); bạn nên xóa 'try' /' catch' - mà sau đó làm cho toàn bộ phương thức 'FindEntities' trông khá dư thừa –

Trả lời

5

Các tham số là kiểu:

System.Linq.Expressions.Expression<Func<T, bool>> find 

Điều đó có nghĩa nó có thể mất một vị (các "ở đâu" khoản), và chỉ một vị. Do đó các bit duy nhất bạn có thể vượt qua trong đó là bộ lọc:

x => x.ConfigurationReference == "172.16.59.175" 

Để làm những gì bạn muốn, bạn sẽ cần phải thêm phần còn lại của các mã trong FindEntities, để nó trở thành:

var val = dataContext.GetTable<T>().Where(find) 
       .OrderByDescending(x => x.Date).Take(100).ToList<T>(); 

(lưu ý rằng cũng Take thực sự nên sau các OrderByDescending)

Một cách để bạn có thể làm điều đó sẽ là:

public static List<T> FindEntities<T>(TrackingDataContext dataContext, 
    System.Linq.Expressions.Expression<Func<T, bool>> find, 
    Func<IQueryable<T>, IQueryable<T>> additonalProcessing = null 
) where T : class 
{ 
    var query = dataContext.GetTable<T>().Where(find); 
    if(additonalProcessing != null) query = additonalProcessing(query); 
    return query.ToList<T>(); 
} 

và gọi:

var data = FindEntities(db, x => x.ConfigurationReference == "172.16.58.175", 
    q => q.OrderByDescending(x => x.Date).Take(100)); 

Tuy nhiên, thẳng thắn mà nói tôi không chắc chắn những gì các điểm này sẽ là ... người gọi có thể làm tất cả điều đó bản thân tại địa phương nhiều thuận tiện, mà không sử dụng FindEntities ở tất cả. Chỉ cần:

var data = db.GetTable<T>() 
      .Where(x => x.ConfigurationReference == "172.16.58.175") 
      .OrderByDescending(x => x.Date).Take(100).ToList(); 

hoặc thậm chí:

var data = db.SomeTable 
      .Where(x => x.ConfigurationReference == "172.16.58.175") 
      .OrderByDescending(x => x.Date).Take(100).ToList(); 

hoặc chỉ:

var data = (from row in db.SomeTable 
      where row.ConfigurationReference == "172.16.58.175" 
      orderby row.Date descending 
      select row).Take(100).ToList(); 
Các vấn đề liên quan