У меня есть IQueryable<T>
из моего DbSet
в Entity Framework. Мне предоставляется «Нечеткая строка поиска» с именем searchText
, например:
public List<T> Search<T>(string searchText)
{
using (var context = ...)
{
var baseQuery = context.Set<T>().AsQueryable();
baseQuery = baseQuery.Where(x =>
DbFunctions.Like(x.PropertyName, searchText)
|| DbFunctions.Like(x.PropertyTwo, searchText)
|| DbFunctions.Like(x.PropertyThree, searchText)
|| DbFunctio..... etc
);
return baseQuery.ToList();
}
}
Но, учитывая характер c generi, я не знаю, какие свойства имеются в типе. Я могу предоставить абстрактный метод для тех, кто реализует это, что позволяет ему предоставить мне список свойств (или даже PropertyInfo
или что-то еще, я могу это выяснить). Но я не знаю, как динамически создать выражение. Это то, что у меня есть до сих пор:
var baseQuery = context.Set<T>().AsQueryable();
var expression = baseQuery.Expression;
var colName = "colName"; // Or names, I can iterate.
var parameter = Expression.Parameter(typeof(T), "x");
var selector = Expression.PropertyOrField(parameter, colName);
expression = Expression.Call(typeof(DbFunctions), nameof(DbFunctions.Like),
new Type[] { baseQuery.ElementType, selector.Type },
expression, Expression.Quote(Expression.Lambda(selector, parameter)));
Проблема в том, что ... ну, с самого начала это не работает. Но в основном из-за того, что я не использую searchText
где-либо в нем, и не знаю, как его подключить. Я ДУМАЮ, что я близко ... но потратил на него слишком много времени.