/
Frexto
/
frexto-orm
Обзор
Документация
Войти
/
Frexto
/
frexto-orm
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
main
SqlExpressionVisitor.cs
67 строк
2 KB
Maksim Fomin
orm
07 окт 2025, 10:58
07 окт 2025, 10:58
f4c0f72
Код
Авторство
О чём код?
using System.Linq.Expressions; using System.Text; namespace FrextoORM; public class SqlExpressionVisitor : ExpressionVisitor { private readonly StringBuilder _sql = new(); private readonly List<object> _parameters = []; public (string sql, object[] parameters) Translate(Expression expr) { Visit(expr); return (_sql.ToString(), _parameters.ToArray()); } protected override Expression VisitBinary(BinaryExpression node) { _sql.Append("("); Visit(node.Left); switch (node.NodeType) { case ExpressionType.Equal: _sql.Append(" = "); break; case ExpressionType.NotEqual: _sql.Append(" <> "); break; case ExpressionType.GreaterThan: _sql.Append(" > "); break; case ExpressionType.GreaterThanOrEqual: _sql.Append(" >= "); break; case ExpressionType.LessThan: _sql.Append(" < "); break; case ExpressionType.LessThanOrEqual: _sql.Append(" <= "); break; case ExpressionType.AndAlso: _sql.Append(" AND "); break; case ExpressionType.OrElse: _sql.Append(" OR "); break; default: throw new NotSupportedException($"Оператор {node.NodeType} не поддерживается"); } Visit(node.Right); _sql.Append(")"); return node; } protected override Expression VisitMember(MemberExpression node) { if (node.Expression?.NodeType == ExpressionType.Parameter) { _sql.Append(node.Member.Name.ToLower()); return node; } var value = GetValue(node); AddParameter(value); return node; } private void AddParameter(object value) { var paramName = $"@p{_parameters.Count}"; _sql.Append(paramName); _parameters.Add(value); } private object GetValue(MemberExpression member) { var objectMember = Expression.Convert(member, typeof(object)); var lambda = Expression.Lambda<Func<object>>(objectMember); return lambda.Compile().Invoke(); } }