Имеется следующий код:
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){...}
но я так понимаю это много лишнего кода.
Привет. Думаю можно так:
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;
Можно еще так:
Если исходить из того, что условная конструкция будет представлена в виде простой бинарной операции, для которой необходимо проверить, что значением правого операнда не является значение по умолчанию. Тогда можно воспользоваться деревьями выражений, а саму проверку вынести в отдельный метод расширения.
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()
Оборудование для ресторана: новинки профессиональной кухонной техники
Частный дом престарелых в Киеве: комфорт, забота и профессиональный уход
Если на странице несколько изображений, которые соответствуют всем условиям в скрипте, то title выводится у всех картинокЕсли же на странице...
Есть одна кнопка или форма на которой висит обработчик и при нажатии происходит ajax запросПри успешном выполнении я могу в success только поместить...