У меня нет вашего datamodel, поэтому я использовал канал Northwind OData для создания решения для вас.
Что это такое, итерация по словарю, который определяет поисковик и свойство, которое нужно искать.
Затем мы создаем предикат и перебираем каждый из этих kvp. Наконец, мы возвращаем функцию лямбды из этого. Думайте об этом как predicatebuilder в цикле:
/*using http://services.odata.org/V3/Northwind/Northwind.svc/ */
//Define a set of KeyValueParis to search for
var keywords = new Dictionary<string, string> {
{"Beverages", "CategoryName"},
{"savory", "Description"},
{"meats", "Description"},
{"Condiments", "CategoryName"}
};
//Create the predicate and initialize it
Expression<Func<Category, bool>> predicate = x => false;
//Define the type
ParameterExpression parameterExp = Expression.Parameter(typeof(Category), "Category");
//Get the Contains method. reference: http://stackoverflow.com/questions/278684/how-do-i-create-an-expression-tree-to-represent-string-containsterm-in-c
MethodInfo method = typeof(string).GetMethod("Contains", new[] { typeof(string) });
//Iterate over each kvp
foreach (var kvp in keywords)
{
var body = predicate.Body;
//set the property or field we are checking against
var memberExpr = Expression.PropertyOrField(parameterExp, kvp.Value);
var constExpr = Expression.Constant(kvp.Key, typeof(string));
var containsMethodExpr = Expression.Call(memberExpr, method, constExpr);
body = Expression.OrElse(body, containsMethodExpr);
predicate = Expression.Lambda<Func<Category, bool>>(body, parameterExp);
}
Categories.Where (predicate).Dump();
Ouput:
Единственное, что осталось для вашей сделать, это заменить Category
против вашего целевого типа. Если это позволит время, я оберну его общим методом и добавлю его к этому ответу.
Linqpad source
// EDIT: Heres статический метод для построения выражения. Вам нужно только указать Dictionary<string,string>
на поисковые запросы.
static Expression<Func<T, bool>> BuildExpression<T>(Dictionary<string, string> searchTerms)
{
//Create the predicate and initialize it
Expression<Func<T, bool>> predicate = x => false;
//Define the type
ParameterExpression parameterExp = Expression.Parameter(typeof(T), "type");
//Get the Contains method. reference: http://stackoverflow.com/questions/278684/how-do-i-create-an-expression-tree-to-represent-string-containsterm-in-c
MethodInfo method = typeof(string).GetMethod("Contains", new[] { typeof(string) });
//Iterate over each kvp
foreach (var kvp in searchTerms)
{
var body = predicate.Body;
//set the property or field we are checking against
var memberExpr = Expression.PropertyOrField(parameterExp, kvp.Value);
var constExpr = Expression.Constant(kvp.Key, typeof(string));
var containsMethodExpr = Expression.Call(memberExpr, method, constExpr);
body = Expression.OrElse(body, containsMethodExpr);
predicate = Expression.Lambda<Func<T, bool>>(body, parameterExp);
}
return predicate;
}
Использование:
var lambda = BuildExpression<Category>(keywords);
Categories.Where(lambda).Dump();
ли вы попробовать AddQueryOption https://msdn.microsoft.com/en-us/library/dd673933.aspx – aguetat
мне это нужно для OData я попробовал некоторые и редактировал свой вопрос пожалуйста, проверьте – Neo