Một giải pháp là sử dụng Dynamic Linq Library, sử dụng thư viện này bạn có thể có:
filterTable = //some code to retrive it
var whereClause = string.Join(" AND ", filterTable.Select(x=> x.Left + x.Right));
var result = context.People.Where(whereClause).ToList();
Giả sử rằng bảng lọc có các cột Left
và Right
và bạn muốn tham gia các bộ lọc bằng AND
.
Đề xuất của tôi là bao gồm thêm chi tiết trong bảng bộ lọc, ví dụ như tách các toán tử khỏi toán hạng và thêm cột xác định tham gia là And
hoặc OR
và cột xác định hàng khác tham gia. Bạn cần cấu trúc cây nếu bạn muốn xử lý các truy vấn phức tạp hơn như (A and B)Or(C and D)
.
Một giải pháp khác là xây dựng cây biểu thức từ bảng bộ lọc. Dưới đây là một ví dụ đơn giản:
var arg = Expression.Parameter(typeof(People));
Expression whereClause;
for(var row in filterTable)
{
Expression rowClause;
var left = Expression.PropertyOrField(arg, row.PropertyName);
//here a type cast is needed for example
//var right = Expression.Constant(int.Parse(row.Right));
var right = Expression.Constant(row.Right, left.Member.MemberType);
switch(row.Operator)
{
case "=":
rowClause = Expression.Equal(left, right);
break;
case ">":
rowClause = Expression.GreaterThan(left, right);
break;
case ">=":
rowClause = Expression.GreaterThanOrEqual(left, right);
break;
}
if(whereClause == null)
{
whereClause = rowClause;
}
else
{
whereClause = Expression.AndAlso(whereClause, rowClause);
}
}
var lambda = Expression.Lambda<Func<People, bool>>(whereClause, arg);
context.People.Where(lambda);
ví dụ này rất đơn giản, bạn nên thực hiện nhiều xác thực kiểu nhập và ... để làm việc này cho tất cả các loại truy vấn.
Nguồn
2015-08-21 08:27:13
Với khung thực thể, bạn có thể sử dụng Vị trí chức năng như thế này: ob.Where (p => p.age> 70 && gender == "male"). – MaticDiba
độ tuổi và 70 là các bộ lọc chuỗi được lấy từ DB. Vậy làm thế nào tôi có thể viết dòng mã này?Đọc lại câu hỏi. cảm ơn. – ConductedClever
Bạn có thể sử dụng [trình tạo biểu thức này] (http://www.codeproject.com/Tips/582450/Build-Where-Clause-Dynamically-in-Linq) –