using System; using System.Collections.Generic; using System.Linq.Expressions; namespace Kean.Infrastructure.Database { /// /// 单列表达式 /// internal sealed class ColumnExpression : ExpressionVisitor { private Dictionary _schema; // 对象名 private string _column; // 列 private string _symbol; // 名称符号 /// /// 解析表达式 /// internal static string Build(Expression expression, Dictionary schema, string symbol) { var visitor = new ColumnExpression { _schema = schema, _symbol = symbol }; visitor.Visit(expression); if (visitor._column != null) { return visitor._column; } throw new Exception(); } protected override Expression VisitMember(MemberExpression node) { if (node.Expression is ParameterExpression pe && pe.NodeType == ExpressionType.Parameter) { _column = _schema == null ? $"{_symbol[0]}{node.Member.Name}{_symbol[1]}" : $"{_symbol[0]}{_schema[pe.Name]}{_symbol[1]}.{_symbol[0]}{node.Member.Name}{_symbol[1]}"; } return node; } protected override Expression VisitUnary(UnaryExpression node) { if (node.NodeType == ExpressionType.Convert) { Visit(node.Operand); } return node; } } }