#c_sharp #entity_framework #linq
Имеется следующий код: IQueryableusers = 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
Привет. Думаю можно так: IQueryableusers = 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 IQueryableWhereIfRightIsNotDefault (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
Комментариев нет:
Отправить комментарий