2012-06-14 54 views
5

tôi tìm thấy những câu dưới đây có thể kết hợp nhiều Expression<Func<T,bool>> biểu thức đó:Kết hợp OrderBy Biểu hiện với Expression

How to merge two C# Lambda Expressions without an invoke?

Tôi đang tự hỏi liệu, sử dụng một kỹ thuật tương tự, làm thế nào để bạn đi về việc sáp nhập một .OrderBy Expression<Func<Entity, Key>> với .Where Expression<Func<Entity, bool>> thành một Biểu thức loại hoặc kế thừa từ loại, System.Linq.Expressions.Expression.

Tôi đang thực sự cắt lớp QueryProvider theo phong cách để lấy T => T == ... Func thông qua các phương thức công khai .Where.OrderBy. Điều này là với ý định rằng biểu thức lớp này được xây dựng sẽ được truyền cho QueryTranslator để tạo ra SQL phù hợp.

Trình theo dõi truy vấn của kiểu này, khi được gọi từ QueryProvider, thường lấy một đối số mà sau đó chuyển thành SQL.

Tôi có thể theo dõi và hiểu câu hỏi trên để hợp nhất hai số .Where Funcs. Các bài viết trên blog sau đây là đặc biệt hữu ích cho việc này, và tôi bắt nguồn từ thông qua mỗi trong những ví dụ:

http://blogs.msdn.com/b/meek/archive/2008/05/02/linq-to-entities-combining-predicates.aspx

bài viết CodeProject Đây cũng là hữu ích:

http://www.codeproject.com/Articles/24255/Exploring-Lambda-Expression-in-C

Khi kết hợp một .OrderBy Func với .Where Func, tuy nhiên hai đối số chung khác nhau. Trong trường hợp của .Where đó là Func<Entity, bool> và trong trường hợp của .OrderBy là Func<Entity, Key>.

Hợp nhất hai Biểu thức này, trên bề mặt, không thẳng về phía trước khi hợp nhất hai với cùng một đối số chung chung.

Động cơ sản xuất Func-Expression được xây dựng (không chắc chắn về thuật ngữ chính xác) có thể kết hợp một .Where Func với một .OrderBy Func. Tôi tò mò về những gì diễn ra dưới mui xe khi hai biểu thức này được hợp nhất để trở thành một System.Linq.Expressions.Expression. Có thể, và nếu như vậy, bạn sẽ làm thế nào để kết hợp một Expression<Func<Entity, bool>> với một số Expression<Func<Entity,Key>> giả định thực thể là cùng loại trong mỗi biểu thức?

+0

Biểu thức kết quả trông như thế nào? – dtb

+0

Nó phải giống như một .Where (T => T.Name == "Cooper"). OrderBy (T => T.DateOfBirth) – Anthony

+1

Bạn hợp nhất '.Where (x => condition1) .Where (x = > condition2) 'to' .Where (x => condition1 && condition) 'nhưng bạn không thể hợp nhất' .Where (x => condition) .OrderBy (x => value) 'theo cùng nghĩa. Vì vậy, một lần nữa, biểu thức kết quả trông như thế nào? 'queryable.Where (x => condition) .OrderBy (x => value)' không trả về một biểu thức, nó trả về một 'IQueryable '. – dtb

Trả lời

3
public IQueryable<T> ApplyExpressions<T, TKey>(
    Expression<Func<T, TKey>> sortBy, 
    Expression<Func<T, bool>> filterBy, 
    IQueryable<T> source) 
{ 
    return source.Where(filterBy).OrderBy(sortBy); 
} 


IQueryable<Customer> query = ApplyExpressions<Customer, int>(
    c => c.Age, 
    c => c.Name.StartsWith("B"), 
    myDC.Customers) 

Expression queryExpression = query.Expression; //tada 
+0

Tôi thích sự thẳng thắn nhưng không hoàn toàn là những gì tôi theo đuổi. Tôi không có nguồn sẵn có nên không có gì để truy vấn theo cách này. – Anthony

0

Tôi nghĩ câu hỏi này không rõ ràng là vì nó không thể trả lời được.

Tôi đã cố gắng tạo một siêu biểu thức, như cách trình tạo biểu thức IQueryable<> hoạt động với các biểu thức .Where.OrderBy tất cả trong một biểu thức.

Nếu không có chủ đề, tuy nhiên, sự hiểu biết giới hạn của tôi về Biểu thức và Cây biểu hiện dường như cho thấy điều đó là không thể.

Để kết hợp biểu thức .Where với biểu thức .OrderBy thành một Biểu thức, bạn cần MethodCallExpression để tách hai số LambdaExpression s.

MethodCallExpression cần một chủ đề để gọi Phương thức. Đây là nơi sử dụng số IQueryable<>.

Tôi đã thay đổi lớp Truy vấn của mình để giữ tất cả các phần riêng biệt của LambdaExpression và sau đó chúng được chuyển đến Trình theo dõi truy vấn một cách riêng biệt. QT kết hợp SQL đầu ra vào đúng vị trí.

Điều này trái ngược với một IQueryable<> QueryProvider phân tích một siêu biểu thức và xuất SQL vào đúng vị trí dựa trên biểu thức của MethodCallExpression.

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