//TODO: detect loops //TODO: identify already added froms private void SelectAll(IDbSet dbSet, string memberName, SelectExpression select, string asPrefix) { select.AddSelection(new AsteriskExpression()); //var table = GetTable(dbSet, memberName); //foreach (var column in dbSet.Columns) //{ // var expression = column.ToColumnExpression(table.Alias); // expression.As = asPrefix + column.ColumnName; // select.AddSelection(expression); // if (column.ReferenceTable != null) // { // var target = _dbSet.Context.GetDbSet(column.ReferenceTable.BaseType); // var targetTable = GetTable(target, column.PropertyName); // var fk = target.PrimaryKey.ToColumnExpression(targetTable.Alias); // select.AddWhere(Expression.MakeBinary(ExpressionType.Equal, column.ToColumnExpression(table.Alias, fk.Type), fk)); // SelectAll(target, column.PropertyName, select, string.Format("{0}{1}.", asPrefix, column.ColumnName)); // } //} }
protected override Expression VisitMethodCall(MethodCallExpression node) { var expression = node.Arguments.Count > 1 ? BuildExpression(node.Arguments[1]) : null; switch (node.Method.Name) { case "Where": case "Single": case "SingleOrDefault": case "StartsWith": case "EndsWith": _where = _where == null ? expression : new WhereExpression(_where, expression); break; case "Select": if (_select == null) { _select = new SelectExpression(); } _select.AddSelection(expression); break; case "Update": Debugger.Break(); if (_update == null) { _update = new UpdateExpression(); } _update.AddSet(expression); break; case "Count": _select = new SelectExpression { Selection = new CountExpression() }; _where = _where == null ? expression : new WhereExpression(_where, expression); break; case "Max": _select = new SelectExpression { Selection = new MaxExpression(expression) }; break; case "Any": _select = new SelectExpression { Selection = new CountExpression() }; _where = _where == null ? expression : new WhereExpression(_where, expression); break; case "First": case "FirstOrDefault": if (_select == null) { _select = new SelectExpression(); } _select.Top = Expression.Constant(1); _where = _where == null ? expression : new WhereExpression(_where, expression); break; case "Take": if (_select == null) { _select = new SelectExpression(); } _select.Top = node.Arguments[1]; break; case "OrderBy": case "ThenBy": if (_orderBy == null) { _orderBy = new OrderByExpression(); } _orderBy.AddColumn(expression, ListSortDirection.Ascending); break; case "ThenByDescending": case "OrderByDescending": if (_orderBy == null) { _orderBy = new OrderByExpression(); } _orderBy.AddColumn(expression, ListSortDirection.Descending); break; case "OfType": if (_ofType == null) { var constantExpression = expression as ConstantExpression; var param = constantExpression == null?node.Method.ReturnType.GetGenericArguments()[0] : constantExpression.Value; var types = _dbSet.GetDiscriminatorValues((Type)param); if (types != null) { _ofType = new ContainsExpression(new ColumnExpression("Discriminator"), types.Cast <Type>().Select(t => t.FullName)); } } break; case "Contains": break; case "Skip": case "AssignNewValue": throw new NotImplementedException(); default: throw new NotSupportedException("Not supported method: " + node.Method.Name); } return(base.VisitMethodCall(node)); }
protected override Expression VisitMethodCall(MethodCallExpression node) { var expression = node.Arguments.Count > 1 ? BuildExpression(node.Arguments[1]) : null; switch (node.Method.Name) { case "Where": case "Single": case "SingleOrDefault": _where = _where == null ? expression : new WhereExpression(_where, expression); break; case "Select": if (_select == null) { _select = new SelectExpression(); } _select.AddSelection(expression); break; case "Update": if (_update == null) { _update = new UpdateExpression(); } _update.AddSet(expression); break; case "Count": _select = new SelectExpression { Selection = new CountExpression() }; _where = _where == null ? expression : new WhereExpression(_where, expression); break; case "First": case "FirstOrDefault": if (_select == null) { _select = new SelectExpression(); } _select.Top = Expression.Constant(1); _where = _where == null ? expression : new WhereExpression(_where, expression); break; case "Take": if (_select == null) { _select = new SelectExpression(); } _select.Top = node.Arguments[1]; break; case "Skip": throw new NotImplementedException(); case "OrderBy": case "ThenBy": if (_orderBy == null) { _orderBy = new OrderByExpression(); } _orderBy.AddColumn(expression, ListSortDirection.Ascending); break; case "ThenByDescending": case "OrderByDescending": if (_orderBy == null) { _orderBy = new OrderByExpression(); } _orderBy.AddColumn(expression, ListSortDirection.Descending); break; case "Contains": case "StartsWith": case "EndsWith": case "AssignNewValue": break; default: throw new NotSupportedException("Not supported method: " + node.Method.Name); } return(base.VisitMethodCall(node)); }