Lambda的Where表达式能指定括号或者优先级吗?

时间:2022-11-16 19:35:03
用Lambda动态生成Where表达式,最终生成表达式o => ((((((o._FLIGHT_PHASE >= 0) And (o._FLIGHT_PHASE <= 2)) And (o.aN31 < 70)) And (o.aN31 >= 50)) And (o.aN32 < 70)) And (o.aN32 >= 50)),这个生成,是按顺序加小括号,跟需求是差太多啊,比如需要生成:o => (((o._FLIGHT_PHASE >= 0) And (o._FLIGHT_PHASE <= 2)) And (((o.aN31 < 70) And (o.aN31 >= 50)) Or ((o.aN32 < 70) And (o.aN32 >= 50)))),有没有办法控制或者操作条件的优先级?

4 个解决方案

#1


"用Lambda动态生成Where表达式"
这个不是你自己生成的吗? Lambda本身就是演算式,他不会为你自动生成什么东西的.

引用 楼主 ffufeng 的回复:
用Lambda动态生成Where表达式,最终生成表达式o => ((((((o._FLIGHT_PHASE >= 0) And (o._FLIGHT_PHASE <= 2)) And (o.aN31 < 70)) And (o.aN31 >= 50)) And (o.aN32 < 70)) And (o.aN32 >= 50)),这个生成,是按顺序加小括号,跟需求是差太多啊,比如需要生成:o => (((o._FLIGHT_PHASE >= 0) And (o._FLIGHT_PHASE <= 2)) And (((o.aN31 < 70) And (o.aN31 >= 50)) Or ((o.aN32 < 70) And (o.aN32 >= 50)))),有没有办法控制或者操作条件的优先级?

#2


优先级 自己在代码中控制,怎么会由 lamda来生成?

#3


引用 1 楼 Lost_Painting 的回复:
"用Lambda动态生成Where表达式"
这个不是你自己生成的吗? Lambda本身就是演算式,他不会为你自动生成什么东西的.

Quote: 引用 楼主 ffufeng 的回复:

用Lambda动态生成Where表达式,最终生成表达式o => ((((((o._FLIGHT_PHASE >= 0) And (o._FLIGHT_PHASE <= 2)) And (o.aN31 < 70)) And (o.aN31 >= 50)) And (o.aN32 < 70)) And (o.aN32 >= 50)),这个生成,是按顺序加小括号,跟需求是差太多啊,比如需要生成:o => (((o._FLIGHT_PHASE >= 0) And (o._FLIGHT_PHASE <= 2)) And (((o.aN31 < 70) And (o.aN31 >= 50)) Or ((o.aN32 < 70) And (o.aN32 >= 50)))),有没有办法控制或者操作条件的优先级?

不明白你说的演算是什么,现在我用如下代码循环添加条件,你看最终生成的表达式,第一个条件括号,累加到第二个又加上括号,一直累加则一直累加括号:
                List<Expression> exprList = new List<Expression>(4);
                ParameterExpression paramExpr = Expression.Parameter(typeof(E_T_ENGINE_PERFM_ALERT), "o");
           exprList.Add(
                        Expression.GreaterThanOrEqual(
                        Expression.Property(paramExpr, "_FLIGHT_PHASE"),
                        Expression.Constant(item.PHA_OPPOSITE == 0 ? item.PHA_ID0 : item.PHA_ID1 + 1, typeof(int))
                        ));

                Expression whereExpr = null;
                // 连接各个子表达式 ,listMath记录是And条件还是Or条件
                int n = 0;
                foreach (var expr in exprList)
                {
                    if (whereExpr == null)
                        whereExpr = expr;
                    else
                    {
                        if (listMath[n++])
                            whereExpr = Expression.And(whereExpr, expr);
                        else
                            whereExpr = Expression.Or(whereExpr, expr);
                    }
                }
                Expression<Func<E_T_ENGINE_PERFM_ALERT, bool>> lambda;
                // 生成Lambda表达式
                if (whereExpr != null)
                    lambda = Expression.Lambda<Func<E_T_ENGINE_PERFM_ALERT, bool>>(whereExpr, paramExpr);
                else
                    lambda = null;

#4


引用 2 楼 q107770540 的回复:
优先级 自己在代码中控制,怎么会由 lamda来生成?


代码循环添加条件,你看最终生成的表达式,第一个条件括号,累加到第二个又加上括号,一直累加则一直累加括号,现在是如果条件是(条件1 and 条件2) or (条件1 and 条件2)这种情况,则不知道怎么去控制了

#1


"用Lambda动态生成Where表达式"
这个不是你自己生成的吗? Lambda本身就是演算式,他不会为你自动生成什么东西的.

引用 楼主 ffufeng 的回复:
用Lambda动态生成Where表达式,最终生成表达式o => ((((((o._FLIGHT_PHASE >= 0) And (o._FLIGHT_PHASE <= 2)) And (o.aN31 < 70)) And (o.aN31 >= 50)) And (o.aN32 < 70)) And (o.aN32 >= 50)),这个生成,是按顺序加小括号,跟需求是差太多啊,比如需要生成:o => (((o._FLIGHT_PHASE >= 0) And (o._FLIGHT_PHASE <= 2)) And (((o.aN31 < 70) And (o.aN31 >= 50)) Or ((o.aN32 < 70) And (o.aN32 >= 50)))),有没有办法控制或者操作条件的优先级?

#2


优先级 自己在代码中控制,怎么会由 lamda来生成?

#3


引用 1 楼 Lost_Painting 的回复:
"用Lambda动态生成Where表达式"
这个不是你自己生成的吗? Lambda本身就是演算式,他不会为你自动生成什么东西的.

Quote: 引用 楼主 ffufeng 的回复:

用Lambda动态生成Where表达式,最终生成表达式o => ((((((o._FLIGHT_PHASE >= 0) And (o._FLIGHT_PHASE <= 2)) And (o.aN31 < 70)) And (o.aN31 >= 50)) And (o.aN32 < 70)) And (o.aN32 >= 50)),这个生成,是按顺序加小括号,跟需求是差太多啊,比如需要生成:o => (((o._FLIGHT_PHASE >= 0) And (o._FLIGHT_PHASE <= 2)) And (((o.aN31 < 70) And (o.aN31 >= 50)) Or ((o.aN32 < 70) And (o.aN32 >= 50)))),有没有办法控制或者操作条件的优先级?

不明白你说的演算是什么,现在我用如下代码循环添加条件,你看最终生成的表达式,第一个条件括号,累加到第二个又加上括号,一直累加则一直累加括号:
                List<Expression> exprList = new List<Expression>(4);
                ParameterExpression paramExpr = Expression.Parameter(typeof(E_T_ENGINE_PERFM_ALERT), "o");
           exprList.Add(
                        Expression.GreaterThanOrEqual(
                        Expression.Property(paramExpr, "_FLIGHT_PHASE"),
                        Expression.Constant(item.PHA_OPPOSITE == 0 ? item.PHA_ID0 : item.PHA_ID1 + 1, typeof(int))
                        ));

                Expression whereExpr = null;
                // 连接各个子表达式 ,listMath记录是And条件还是Or条件
                int n = 0;
                foreach (var expr in exprList)
                {
                    if (whereExpr == null)
                        whereExpr = expr;
                    else
                    {
                        if (listMath[n++])
                            whereExpr = Expression.And(whereExpr, expr);
                        else
                            whereExpr = Expression.Or(whereExpr, expr);
                    }
                }
                Expression<Func<E_T_ENGINE_PERFM_ALERT, bool>> lambda;
                // 生成Lambda表达式
                if (whereExpr != null)
                    lambda = Expression.Lambda<Func<E_T_ENGINE_PERFM_ALERT, bool>>(whereExpr, paramExpr);
                else
                    lambda = null;

#4


引用 2 楼 q107770540 的回复:
优先级 自己在代码中控制,怎么会由 lamda来生成?


代码循环添加条件,你看最终生成的表达式,第一个条件括号,累加到第二个又加上括号,一直累加则一直累加括号,现在是如果条件是(条件1 and 条件2) or (条件1 and 条件2)这种情况,则不知道怎么去控制了