本篇内容介绍了“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的用法”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。
原文链接:https://my.oschina.net/u/2963604/blog/5034187