создать дерево лямбда-выражений, Expression<Func<T, bool>>, динамически выполняющее предикат на основе Or и And
У меня есть строка поиска, которая может быть, и я хочу написать правильныйExpression<Func<T, bool>>
который может найти"sub1"
,"sub2"
,"sub3"
и вx.Name
С другой стороны, я хочу изменитьx.Name.ToLower().Contains(productParams.Search)
для моей цели. Теперь я могу искать термин"sub1 sub2 sub3"
. Тем не менее, я хочу искать и подстроки.
мои ожидания от поиска:"sub1" || "sub2" || "sub3" || "sub1 sub2 sub3"
productParams.Search = "sub1 sub2 sub3"
Как это сделать?
public class ProductsSpecification : BaseSpecifcation<Product>
{
public ProductsSpecification(ProductSpecParams productParams) : base(x =>
(string.IsNullOrEmpty(productParams.Search) ||
x.Name.ToLower().Contains(productParams.Search)) &&
(!productParams.BrandId.HasValue || x.ProductBrandId == productParams.BrandId))
}
Базовая спецификация:
public class BaseSpecifcation<T> : ISpecification<T>
{
public BaseSpecifcation(Expression<Func<T, bool>> criteria)
{
Criteria = criteria;
}
public Expression<Func<T, bool>> Criteria { get; }
}