2017-10-03 77 views
5

Tôi cần tạo chức năng cho phép người dùng lọc các thực thể bằng truy vấn theo nghĩa đen (ví dụ: age gt 20 and name eq 'john'). Có một chức năng được cung cấp để làm điều này trong C#/Asp.Net MVC hay tôi phải phân tích cú pháp truy vấn này một mình?Làm cách nào để lọc các thực thể bằng truy vấn trong C#?

Tôi nhận thấy rằng OData ngụ ý có chức năng chính xác như vậy (OData Filter Expressions MSDN). Tuy nhiên, tôi không quen thuộc với nó vì vậy tôi không biết làm thế nào để thực hiện hành vi như vậy trong dự án của tôi.

tôi cần một cái gì đó như thế này:

var list = new List<Person> 
{ 
    new Person { Name = "John", Age = 30 }, 
    new Person { Name = "Hanna", Age = 25 }, 
    new Person { Name = "John", Age = 15 } 
}; 

string query = "age gt 20 and name eq /'John/'"; 
IEnumerable<Person> result = list.FilterByExpression(query); 
// returns list with John aged 30 

Lời khuyên nào sẽ được đánh giá cao.

Trả lời

2

Có một gói trên Nuget được gọi là Linq2Rest, có chứa một phương pháp mở rộng cho IEnumerable được gọi là Filter. Bạn có thể vượt qua chuỗi bộ lọc bạn cần để làm cho bộ lọc xảy ra. Bên trong, nó sẽ được chuyển đổi thành một Expression Tree và sẽ được sử dụng với các phương thức mở rộng có thể đếm được.

Đối với mẫu:

var filteredSource = source.Filter(Request.Params); 

Xem bài viết này Creating a .Net queryable client for ASP.Net Web API oData services về làm thế nào để đối phó với vấn đề kiểu này sử dụng thư viện JSON.NetLinq2Rest để giải quyết vấn đề này.

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