Как Добавить к выражению

Просто вокруг полутонового цвета или к черному или к белому.

float gray = (r + g + b) / 3
if(gray > 0x7F) return 0xFF;
return 0x00;
40
задан Community 23 May 2017 в 11:47
поделиться

3 ответа

Это сложный сценарий. Вы почти создаете свой собственный механизм запросов на основе LINQ. Решение JaredPar (куда оно делось?) Отлично подходит, если вы хотите логическое И между всеми вашими критериями, но это может быть не всегда так.

Когда я недавно спорил с этим в одном из моих проектов, я создал два списка:

List<Predicate<T>> andCriteria;
List<Predicate<T>> orCriteria;

(в данном случае T - это клиент , для вас)

Я бы заполнил списки предикатами, которые я хочу, чтобы они были истинными. Например,

decimal salRequirement = 50000.00;
andCriteria.Add(c => c.Salary > salRequirement);
orCriteria.Add(c => c.IsMarried);

Затем я проверил бы все критерии в списках в моем предложении Where. Например:

Expression<Func<Client, bool>> clientWhere =
    c => andCriteria.All(pred => pred(c) ) && orCriteria.Any(pred => pred(c) );

Это также можно сделать с помощью цикла for для удобства чтения.

12
ответ дан 27 November 2019 в 01:34
поделиться

Взгляните на Predicate Builder , я думаю, это может сработать для вас.

6
ответ дан 27 November 2019 в 01:34
поделиться

Я считаю, что вы можете просто сделать следующее:

Expression<Func<Client, bool>> clientWhere = c => true;

if (filterByClientFName)
{
    var prefix = clientWhere.Compile();
    clientWhere = c => prefix(c) && c.ClientFName == searchForClientFName;
}
if (filterByClientLName)
{
    var prefix = clientWhere.Compile();
    clientWhere = c => prefix(c) && c.ClientLName == searchForClientLName;
}

Если вам нужно сохранить все в Expression -land (для использования с IQueryable ) , вы также можете сделать следующее:

Expression<Func<Client, bool>> clientWhere = c => true;

if (filterByClientFName)
{
    Expression<Func<Client, bool>> newPred = 
        c => c.ClientFName == searchForClientFName;
    clientWhere = Expression.Lambda<Func<Freight, bool>>(
        Expression.AndAlso(clientWhere, newPred), clientWhere.Parameters);
}
if (filterByClientLName)
{
    Expression<Func<Client, bool>> newPred = 
        c => c.ClientLName == searchForClientLName;
    clientWhere = Expression.Lambda<Func<Freight, bool>>(
        Expression.AndAlso(clientWhere, newPred), clientWhere.Parameters);
}

Это можно сделать менее подробным, определив этот метод расширения:

public static Expression<TDelegate> AndAlso<TDelegate>(this Expression<TDelegate> left, Expression<TDelegate> right)
{
    return Expression.Lambda<TDelegate>(Expression.AndAlso(left, right), left.Parameters);
}

Затем вы можете использовать такой синтаксис:

Expression<Func<Client, bool>> clientWhere = c => true;
if (filterByClientFName)
{
    clientWhere = clientWhere.AndAlso(c => c.ClientFName == searchForClientFName);
}
if (filterByClientLName)
{
    clientWhere = clientWhere.AndAlso(c => c.ClientLName == searchForClientLName);
}
55
ответ дан 27 November 2019 в 01:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: