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

337
01 августа 2017, 14:32

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

IQueryable<User> 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){...} но я так понимаю это много лишнего кода.

Answer 1

Привет. Думаю можно так:

IQueryable<User> 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;
Answer 2

Можно еще так:

Если исходить из того, что условная конструкция будет представлена в виде простой бинарной операции, для которой необходимо проверить, что значением правого операнда не является значение по умолчанию. Тогда можно воспользоваться деревьями выражений, а саму проверку вынести в отдельный метод расширения.

public static class EfExtension
{
    public static IQueryable<T> WhereIfRightIsNotDefault<T>(this IQueryable<T> source, Expression<Func<T, bool>> 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<object>.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<Func<object>>(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()
READ ALSO
Почему скрипт не у всех картинок выводит title?

Почему скрипт не у всех картинок выводит title?

Если на странице несколько изображений, которые соответствуют всем условиям в скрипте, то title выводится у всех картинокЕсли же на странице...

291
Подскажите что значит &amp;=

Подскажите что значит &=

Есть вот такая строка кода

303
Как обновить страницу в jquery ajax запросе?

Как обновить страницу в jquery ajax запросе?

Есть одна кнопка или форма на которой висит обработчик и при нажатии происходит ajax запросПри успешном выполнении я могу в success только поместить...

350
Hello world для jsdom с jquery

Hello world для jsdom с jquery

В node-jsdom hello world c jquery выглядит так:

332