Объединение в Динамическом Линке - PullRequest
2 голосов
/ 29 февраля 2012

Я использую Dynamic Linq для запроса к нашей базе данных строки, которая создается на основе фильтров, которые вводит пользователь. В одном случае нам нужно выполнить объединение двух полей, чтобы применить наш фильтр к результату.

Результирующий синтаксис будет выглядеть примерно так:

(nullableField ?? requiredField) == "foo"

Или, если используется метод расширения:

(nullableField ?? requiredField).Contains("foo")

Dynamic Linq или, по крайней мере, версия, которая у нас сейчас есть в нашем проекте, не поддерживает объединение, есть ли какие-либо реализации или предложения относительно того, как я могу реализовать свою собственную? У меня мало опыта с выражениями, и я изо всех сил пытаюсь создать свой собственный. До сих пор следующий код работает на моем ограниченном тестировании, но я не уверен, правильно ли я это сделал.

Это вызывается ParseExpression ():

    // ?? operator
    Expression ParseCoalesce()
    {
        Expression left = ParseLogicalOr();
        if (token.id == TokenId.DoubleQuestion)
        {
            NextToken();
            Expression expr1 = ParseExpression();
            left = Expression.Coalesce(left, expr1);
        }
        return left;
    }

Мысли об этом коде? Есть ли лучший способ сделать это?

Ответы [ 2 ]

1 голос
/ 29 февраля 2012

Если ваша система поддерживает ConditionalExpression, вы можете реализовать ее как

(nullableField != null ? nullableField == "foo" : requiredField == "foo")

или

(nullableField != null ? nullableField : requiredField) == "foo"
0 голосов
/ 02 января 2019

Оживление этого вопроса из мертвых, так как он, кажется, единственный, связанный с оператором coallesce в динамическом linq.Версия, созданная мной, обрабатывает троичный оператор в ParseExpression, поэтому я просто расширил ее, подобно тому, как вы это делали:

    Expression ParseExpression()
    {
        int errorPos = token.pos;
        Expression expr = ParseLogicalOr();
        if (token.id == TokenId.Coalesce)
        {
            NextToken();
            Expression expr1 = ParseExpression();
            expr = Expression.Coalesce(expr, expr1);
        }
        else if (token.id == TokenId.Question)
        {
            NextToken();
            Expression expr1 = ParseExpression();
            ValidateToken(TokenId.Colon, Res.ColonExpected);
            NextToken();
            Expression expr2 = ParseExpression();
            expr = GenerateConditional(expr, expr1, expr2, errorPos);
        }
        return expr;
    }

Поскольку я столкнулся с отсутствующей функциональностью(затем, в и т. д.), я добавляю ее в пользовательскую библиотеку, расположенную здесь:

https://github.com/jayoungers/DynamicExpressions/tree/master/DynamicExpressions/Linq

Она доступна в NuGet как DynamicExpressions

...