ExpressionVisitor解析表达式树的问题

Eason0807 2019-12-16 07:34:29
假设有这么一个表达式目录树
Expression<Func<Customer, bool>> expression1 = c => (c.Id > 5 && c.Name.Contains("asdd")) ||( c.Id==1 || c.Id==2);


现在表达式c.Id > 5 ,c.Name.Contains("asdd")这一类的已经解析出来了没啥问题

关键是怎么能把圆括括号"()"也解析出来,否则这种多条件的,表达不出来原来的意思啊
...全文
253 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
Eason0807 2019-12-17
  • 打赏
  • 举报
回复
引用 7 楼 github_36000833 的回复:
[quote=引用 1 楼 github_36000833 的回复:] 表达式树不是已经给你结构了吗? 比如: 二目表达式OrElse, 左边是:(c.Id > 5 && c.Name.Contains("asdd")) 右边是:(c.Id==1 || c.Id==2) 可以看到括号的作用已经反映到表达式里了。
二目表达式OrElse,----> 对应 SQL OR 左边 ---> 对应 假设 L 右边 ---> 对应 假设 R SQL不就是 (L) OR (R) 把L和R扩展开,不就是你要的结果:((Id > 5) AND (Name like '%asdd%')) OR ((Id = 1) OR (Id = 2)) [/quote] 我明白你的意思了,谢谢!我开始想的有偏差,我以为也能像取其他部分一样重写方法就能取到括号呢
github_36000833 2019-12-17
  • 打赏
  • 举报
回复
引用 1 楼 github_36000833 的回复:
表达式树不是已经给你结构了吗? 比如: 二目表达式OrElse, 左边是:(c.Id > 5 && c.Name.Contains("asdd")) 右边是:(c.Id==1 || c.Id==2) 可以看到括号的作用已经反映到表达式里了。
二目表达式OrElse,----> 对应 SQL OR 左边 ---> 对应 假设 L 右边 ---> 对应 假设 R SQL不就是 (L) OR (R) 把L和R扩展开,不就是你要的结果:((Id > 5) AND (Name like '%asdd%')) OR ((Id = 1) OR (Id = 2))
Eason0807 2019-12-17
  • 打赏
  • 举报
回复
如果按照表达式的意思的话应该是(Id > 5 AND Name like '%asdd%') OR (Id = 1 OR Id = 2) 这个样子的
Eason0807 2019-12-17
  • 打赏
  • 举报
回复
引用 4 楼 github_36000833 的回复:
逻辑上,你已经不需要括号了。 括号的作用,已经反应到表达里了。
现在我翻译完是这样的 Id > 5 AND Name like '%asdd%' OR Id = 1 OR Id = 2
github_36000833 2019-12-17
  • 打赏
  • 举报
回复
逻辑上,你已经不需要括号了。 括号的作用,已经反应到表达里了。
Eason0807 2019-12-17
  • 打赏
  • 举报
回复
引用 1 楼 github_36000833 的回复:
表达式树不是已经给你结构了吗? 比如: 二目表达式OrElse, 左边是:(c.Id > 5 && c.Name.Contains("asdd")) 右边是:(c.Id==1 || c.Id==2) 可以看到括号的作用已经反映到表达式里了。
我的目的是,把传进来的表达式翻译成Sql查询条件
Eason0807 2019-12-17
  • 打赏
  • 举报
回复
引用 1 楼 github_36000833 的回复:
表达式树不是已经给你结构了吗? 比如: 二目表达式OrElse, 左边是:(c.Id > 5 && c.Name.Contains("asdd")) 右边是:(c.Id==1 || c.Id==2) 可以看到括号的作用已经反映到表达式里了。
是的,用ExpressionVisitor我可以取到表达式的Member,BinaryExpression,Constant,Method这几部分,但是圆弧括号怎么取呢?难道要正则匹配出来吗?
github_36000833 2019-12-17
  • 打赏
  • 举报
回复
表达式树不是已经给你结构了吗?

比如:
二目表达式OrElse,
左边是:(c.Id > 5 && c.Name.Contains("asdd"))
右边是:(c.Id==1 || c.Id==2)

可以看到括号的作用已经反映到表达式里了。

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧