Страницы

Поиск по вопросам

суббота, 15 февраля 2020 г.

C# проверка на null поля в в LINQ запросе

#c_sharp #entity_framework #linq


Имеется следующий код:

IQueryable users = from c in db.UserSet
                                               where c.Date == dateTimePicker1.Value &&
                                                     c.FirstName == textBox2.Text &&
                                                     c.LastName == textBox3.Text &&
                                                     c.Patronym == textBox4.Text &&
                                                     c.City == textBox5.Text &&
                                                     c.Country == textBox6.Text
                                               select c;


Помогите реализовать проверку на null в каждом поле. То есть если сейчас хотя бы
одно поле будет пустым, то запрос выдаст 0 строк независимо от других условий. Как
можно сделать так, чтобы пустые поля игнорировались, и запрос выполнялся по остальным
условиям?

Конечно можно сделать проверку на уровне if (textbox1.text!=null){...} но я так понимаю
это много лишнего кода. 
    


Ответы

Ответ 1



Привет. Думаю можно так: IQueryable users = from c in db.UserSet where (c.Date == dateTimePicker1.Value || dateTimePicker1.Value == null) && (c.FirstName == textBox2.Text || textBox2.Text == null) && (c.LastName == textBox2.Text || textBox2.Text == null) && (c.Patronym == textBox3.Text || textBox3.Text == null) && (c.City == textBox4.Text || textBox4.Text == null) && (c.Country == textBox5.Text || textBox5.Text == null) select c;

Ответ 2



Можно еще так: Если исходить из того, что условная конструкция будет представлена в виде простой бинарной операции, для которой необходимо проверить, что значением правого операнда не является значение по умолчанию. Тогда можно воспользоваться деревьями выражений, а саму проверку вынести в отдельный метод расширения. public static class EfExtension { public static IQueryable WhereIfRightIsNotDefault(this IQueryable source, Expression> predicate) where T : class { var body = predicate.Body as BinaryExpression; if (body == null) return source; // Получаем значение правого операнда. var currentValue = Expression.Lambda(body.Right) .Compile().DynamicInvoke(); // Получаем значение по умолчанию для типа правого операнда. var defaultValueForType = GetDefaultValueForType(body.Right.Type); // Сравниваем текущее значение со значением по умолчанию. var isEquals = EqualityComparer.Default .Equals(currentValue, defaultValueForType); // Если текущее значение не равно значению по умолчанию. if (!isEquals) { // Добавляем условие в предложение where. source = source.Where(preducate); return source; } return source; } // Возвращает значение по умолчанию для конкретного типа. private static object GetDefaultValueForType(Type type) { var p = Expression.Convert(Expression.Default(type), typeof(object)); return Expression.Lambda>(p).Compile()(); } } Использование: var users = db.UserSet .WhereIfRightIsNotDefault(p => p.Date == dateTimePicker1.Value) .WhereIfRightIsNotDefault(p => p.FirstName == textBox2.Text) .WhereIfRightIsNotDefault(p => p.LastName == textBox3.Text) .WhereIfRightIsNotDefault(p => p.Patronym == textBox4.Text) .WhereIfRightIsNotDefault(p => p.City == textBox5.Text) .WhereIfRightIsNotDefault(p => p.Country == textBox6.Text).ToList()

Комментариев нет:

Отправить комментарий