Я хочу реализовать следующий метод
public static class Filters
{
public static Expression<Func<T,bool>> ContainsText<T>(
string text, params Expression<Func<T,string>>[] fields)
{
//..
}
}
так что, если бы я хотел (например) найти кого-нибудь, чье имя содержит «Марк» или чье имя папа содержит «Марк», я мог бы сделать что-то вроде этого:
var textFilter = Filters.ContainsText<Individual>("Mark", i=>i.FirstName, i=>i.LastName, i=>i.Father.FirstName, i => i.Father.LastName);
var searchResults = _context.Individuals.Where(textFilter).ToList();
Моя конечная цель - создать ContainsTextSpecification
для упрощения текстовой фильтрации, которую я могу использовать следующим образом:
var textSpec = new ContainsTextSpecification<Individual>(i=>i.FirstName, i=> i.LastName, i=>i.DepartmentName, i=>i.SSN, i=>i.BadgeNumber);
textSpec.Text = FormValues["filter"];
var results = individuals.Find(textSpec);
Я нашел что-то, что заставляет меня закрыть до того, что я хочу здесь , но я хочу иметь возможность указать поля, которые я хочу отфильтровать, используя Func<T,string>
вместо просто название поля. ( edit: я хочу иметь возможность указать проверяемые значения, а не имена полей )
static Expression<Func<T, bool>> GetExpression<T>(string propertyName, string propertyValue)
{
var parameterExp = Expression.Parameter(typeof(T), "type");
var propertyExp = Expression.Property(parameterExp, propertyName);
MethodInfo method = typeof(string).GetMethod("Contains", new[] { typeof(string) });
var someValue = Expression.Constant(propertyValue, typeof(string));
var containsMethodExp = Expression.Call(propertyExp, method, someValue);
return Expression.Lambda<Func<T, bool>>(containsMethodExp, parameterExp);
}
var results = individualRepo.Get(textSpec);