public static Coerce ( |
||
expression | ||
Результат |
protected override Expression VisitConditional(ConditionalExpression expression) { var test = this.Visit(expression.Test); var ifFalse = this.Visit(expression.IfFalse); var ifTrue = this.Visit(expression.IfTrue); if (test is BitBooleanExpression) { test = Expression.Equal(test, Expression.Constant(true, test.Type)); } if (ifFalse.Type.GetUnwrappedNullableType() == typeof(bool) && !(ifFalse is BitBooleanExpression)) { ifFalse = BitBooleanExpression.Coerce(ifFalse); } if (ifTrue.Type.GetUnwrappedNullableType() == typeof(bool) && !(ifTrue is BitBooleanExpression)) { ifTrue = BitBooleanExpression.Coerce(ifTrue); } if (test != expression.Test || ifFalse != expression.IfFalse || ifTrue != expression.IfTrue) { return(new BitBooleanExpression(Expression.Condition(test, ifTrue, ifFalse))); } else { return(base.VisitConditional(expression)); } }
protected override Expression VisitSelect(SqlSelectExpression selectExpression) { var count = selectExpression.Columns.Count; List <SqlColumnDeclaration> newColumns = null; for (var i = 0; i < count; i++) { var column = selectExpression.Columns[i]; var visitedColumnExpression = this.Visit(column.Expression); if (visitedColumnExpression.Type.GetUnwrappedNullableType() == typeof(bool) && !(visitedColumnExpression is BitBooleanExpression)) { if (newColumns == null) { newColumns = new List <SqlColumnDeclaration>(selectExpression.Columns.Take(i)); } var newColumnExpression = BitBooleanExpression.Coerce(visitedColumnExpression); var newColumnDeclaration = new SqlColumnDeclaration(column.Name, newColumnExpression); newColumns.Add(newColumnDeclaration); } else if (visitedColumnExpression != column.Expression) { if (newColumns == null) { newColumns = new List <SqlColumnDeclaration>(selectExpression.Columns.Take(i)); } newColumns.Add(column.ReplaceExpression(visitedColumnExpression)); } else if (newColumns != null) { newColumns.Add(column); } } var from = this.VisitSource(selectExpression.From); var where = this.Visit(selectExpression.Where); var orderBy = this.VisitExpressionList(selectExpression.OrderBy); var groupBy = this.VisitExpressionList(selectExpression.GroupBy); var skip = this.Visit(selectExpression.Skip); var take = this.Visit(selectExpression.Take); if (where is BitBooleanExpression) { where = Expression.Equal(where, Expression.Constant(true, where.Type)); } if (from != selectExpression.From || where != selectExpression.Where || newColumns != selectExpression.Columns || orderBy != selectExpression.OrderBy || groupBy != selectExpression.GroupBy || take != selectExpression.Take || skip != selectExpression.Skip) { return(new SqlSelectExpression(selectExpression.Type, selectExpression.Alias, newColumns ?? selectExpression.Columns, from, where, orderBy, groupBy, selectExpression.Distinct, skip, take, selectExpression.ForUpdate, selectExpression.Reverse, selectExpression.Into)); } return(base.VisitSelect(selectExpression)); }
protected override Expression VisitSelect(SqlSelectExpression selectExpression) { List <SqlColumnDeclaration> newColumns = null; for (var i = 0; i < selectExpression.Columns.Count; i++) { var column = selectExpression.Columns[i]; var visitedColumnExpression = this.Visit(column.Expression); if (visitedColumnExpression.Type.GetUnwrappedNullableType() == typeof(bool) && !(visitedColumnExpression is BitBooleanExpression)) { if (newColumns == null) { newColumns = new List <SqlColumnDeclaration>(selectExpression.Columns.Take(i)); } var newColumnExpression = BitBooleanExpression.Coerce(visitedColumnExpression); var newColumnDeclaration = new SqlColumnDeclaration(column.Name, newColumnExpression); newColumns.Add(newColumnDeclaration); } else if (visitedColumnExpression != column.Expression) { if (newColumns == null) { newColumns = new List <SqlColumnDeclaration>(selectExpression.Columns.Take(i)); } newColumns.Add(column.ReplaceExpression(visitedColumnExpression)); } else if (newColumns != null) { newColumns.Add(column); } } var where = this.Visit(selectExpression.Where); if ((where is BitBooleanExpression)) { where = Expression.Equal(where, Expression.Constant(true)); } if (where != selectExpression.Where) { if (newColumns != null) { return(selectExpression.ChangeWhereAndColumns(where, new ReadOnlyList <SqlColumnDeclaration>(newColumns))); } else { return(selectExpression.ChangeWhere(where)); } } else if (newColumns != null) { return(selectExpression.ChangeColumns(newColumns, true)); } else { return(base.VisitSelect(selectExpression)); } }