本篇内容介绍了“c#中ExpressionVistor的用法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
class MyVistor :ExpressionVisitor { private string tableName; private StringBuilder sbSql = new StringBuilder(); public string getsbSql() { return sbSql.ToString(); } private string ExpressionTypeToSQL(ExpressionType type) { switch(type) { case ExpressionType.Add: return " + "; case ExpressionType.And: return " and "; case ExpressionType.AndAlso: return " and "; case ExpressionType.Assign: return " = "; case ExpressionType.NotEqual: return " != "; case ExpressionType.Equal: return " == "; case ExpressionType.GreaterThan: return " > "; case ExpressionType.GreaterThanOrEqual: return " >= "; case ExpressionType.LessThan: return " < "; case ExpressionType.LessThanOrEqual: return " <= "; case ExpressionType.Multiply: return " * "; case ExpressionType.Or: case ExpressionType.OrElse: return " or "; default: return ""; } } public override Expression Visit(Expression node) { return base.Visit(node); } protected override Expression VisitBinary(BinaryExpression node) { base.Visit(node.Left); sbSql.Append(ExpressionTypeToSQL(node.NodeType)); base.Visit(node.Right); return node; } public string GetSqlString() { return "select * from " + tableName + " where " + sbSql.ToString(); } protected override Expression VisitConstant(ConstantExpression node) { if(node.Type == typeof(int)) { sbSql.Append(node.Value);//ConstantExpression.Value是表示常量表达式的值 } else { sbSql.Append("'" + node.Value + "'"); } return base.VisitConstant(node); } protected override Expression VisitParameter(ParameterExpression node) { if(tableName == null) { tableName = "[" + node.Type.Name + "]"; } return base.VisitParameter(node); } protected override Expression VisitMember(MemberExpression node) { sbSql.Append("[" + node.Member.Name + "]"); return base.VisitMember(node); } } class RefClas { public int id; public int age; public RefClas(int id, int age) { this.id = id; this.age = age; } } Expression<Func<RefClas, bool>> expressionsql = a => a.id > 5 && a.age < 10; MyVistor myvistor = new MyVistor(); Expression exp = myvistor.Visit(expressionsql); Console.WriteLine(myvistor.getsbSql());//[id] > 5 and [age] < 10 //编译 var func2 = expressionsql.Compile(); RefClas cls2 = new RefClas(10,20); bool res = func2(cls2); Console.WriteLine("func2返回结果:" + res); //func2返回结果:False Console.WriteLine(myvistor.GetSqlString());//select * from [RefClas] where [id] > 5 and [age] < 10
“c#中ExpressionVistor的用法”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。