Несколько Условий в Лямбда-выражениях при C# во время выполнения

Я хотел бы знать, как смочь сделать Дерево выражений путем ввода больше чем одного параметра

Пример:

dataContext.Users.Where(u => u.username == "Username" && u.password == "Password")

В данный момент код, который я сделал, был следующим, но хотел бы сделать более общим в отношениях, является ли условие ИЛИ или И

public Func<TLinqEntity, bool> ANDOnlyParams(string[] paramNames, object[] values)
    {
        List<ParameterExpression> paramList = new List<ParameterExpression>();
        foreach (string param in paramNames)
        {
            paramList.Add(Expression.Parameter(typeof(TLinqEntity), param));
        }

        List<LambdaExpression> lexList = new List<LambdaExpression>();
        for (int i = 0; i < paramNames.Length; i++)
        {
            if (i == 0)
            {
                Expression bodyInner = Expression.Equal(
                                    Expression.Property(
                                        paramList[i], paramNames[i]),
                                        Expression.Constant(values[i]));
                lexList.Add(Expression.Lambda(bodyInner, paramList[i]));
            }
            else
            {
                Expression bodyOuter = Expression.And(
                                    Expression.Equal(
                                    Expression.Property(
                                    paramList[i], paramNames[i]),
                                    Expression.Constant(values[i])),
                                    Expression.Invoke(lexList[i - 1], paramList[i]));
                lexList.Add(Expression.Lambda(bodyOuter, paramList[i]));
            }
        }

        return ((Expression<Func<TLinqEntity, bool>>)lexList[lexList.Count - 1]).Compile();
    }

Спасибо

7
задан Ryan 21 March 2010 в 11:30
поделиться

1 ответ

Выражение. И здесь неверно использовать, это побитовое и. Вы хотите И еще .

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

В конечном итоге для истинной гибкости вам понадобится язык мини-запросов. Проанализируйте язык, чтобы построить дерево выражений.

В краткосрочной перспективе вы можете обойтись чем-то гораздо более простым: списком примитивных выражений и флагом bool, указывающим, следует ли их комбинировать с && или ||.

Обновление - я заметил, что вы фактически компилируете полученное выражение в настоящий делегат. Это заставляет меня задуматься, почему вы вообще делаете это жестко. Почему бы просто не записать выражение в виде лямбды, как в исходном примере? (Если вы используете Linq to SQL или EF, вам все равно не следует компилировать выражение.)

Обновление 2 - вам, вероятно, понадобится Dynamic Linq .

2
ответ дан 7 December 2019 в 18:42
поделиться
Другие вопросы по тегам:

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