Как мне подходить к этому?
Одним из главных преимуществ LINQ является то, что вы получаете безопасность типов.Запрашивая его динамически, вы по сути теряете это преимущество.Хотя это не совсем «динамично», вы можете воспользоваться этим преимуществом, написав метод расширения, который включает в себя конкретные поля, которые вы хотите запросить:
public static IQueryable<MyTable> WhereContains(this IQueryable<MyTable> source, string field, string value)
{
switch (field)
{
case nameof(MyTable.SomeField):
return source.Where(a => a.SomeField.Contains(value));
case nameof(MyTable.SomeOtherField):
return source.Where(a => a.SomeOtherField.Contains(value));
// ... etc
default:
throw new ArgumentOutOfRangeException($"Unexpected field {field}");
}
}
Таким образом, ваш код может вызвать следующее:
var dataField = "DemandStatusName";
var searchParam = form.GetValues("columns[" + j + "][search][value]").FirstOrDefault();
dataset.WhereContains(dataField, searchParam).OrderBy(a => a.Whatever)
При этом, буквально отвечая на ваш вопрос, вы технически можете динамически создавать выражение LINQ.Это может выглядеть примерно так, но имейте в виду, что производительность будет низкой, а неожиданные значения могут ее сломать и / или открыть некоторые уязвимости безопасности, особенно если они исходят от ввода пользователя:
var table = Expression.Parameter(typeof(MyTable));
var property = Expression.PropertyOrField(table, dataField);
var param = Expression.Constant(searchParam);
var contains = Expression.Call(property, "Contains", Type.EmptyTypes, searchParam);
var expression = Expression.Lambda<Func<MyTable,bool>>(contains, table);
var result = dataset.Where(expression);