РЕДАКТИРОВАТЬ после уточнения вопроса:
Вы можете реализовать универсальный метод расширения для IQueryable, когда предложение динамически создается:
public static class QueryExtensions
{
public static IQueryable<TModel> WhereNotNull<TModel>(this IQueryable<TModel> query, string propertyName)
{
var parameter = Expression.Parameter(typeof(TModel), "x");
var body = Expression.PropertyOrField(parameter, propertyName);
var comparison = Expression.NotEqual(body, Expression.Constant(null, typeof(object)));
var lambda = Expression.Lambda<Func<TModel, bool>>(comparison, parameter);
return query.Where(lambda);
}
}
Вызовите его следующим образом:
query = query.WhereNotNull(nameof(MyModel.Property1));
или
query = query.WhereNotNull("Property1");
РЕДАКТИРОВАТЬ после запроса проверки на наличие пустых или пробельных символов для строк:
Пример вызова string.IsNullOrWhiteSpace()
для свойств строки:
public static IQueryable<TModel> WhereNotNull<TModel>(this IQueryable<TModel> query, string propertyName)
{
var parameter = Expression.Parameter(typeof(TModel), "x");
var body = Expression.PropertyOrField(parameter, propertyName);
Expression<Func<TModel, bool>> lambda = null;
if (body.Type == typeof(string))
{
var methodCall = Expression.Call(typeof(string), nameof(string.IsNullOrWhiteSpace), null, body);
var nullOrWhiteSpaceComparison = Expression.Not(methodCall);
lambda = Expression.Lambda<Func<TModel, bool>>(nullOrWhiteSpaceComparison, parameter);
}
else
{
var nullComparison = Expression.NotEqual(body, Expression.Constant(null, typeof(object)));
lambda = Expression.Lambda<Func<TModel, bool>>(nullComparison, parameter);
}
return query.Where(lambda);
}
Если вы (в каком-то другом контексте) хотите объединить несколько выражений, вы можете использовать Expression.And(Expression left, Expression right)
или Expression.Or(Expression left, Expression right)
.Передайте одинарное / двоичное выражение в качестве параметров слева и справа.