private void VisitSelect(MethodCallExpression expression) { if (expression.Arguments[0].Type.IsSubclassOf(typeof(Base))) { var tableName = GetTableName(((ConstantExpression)expression.Arguments[0]).Value); var alias = ((LambdaExpression)StripQuotes(expression.Arguments[1])).Parameters[0].Name; var table = new SqlTable { Alias = alias, Name = tableName }; if (!Query.Tables.Contains(table)) Query.Tables.Add(table); } else { Visit(expression.Arguments[0]); } var output = ((LambdaExpression)StripQuotes(expression.Arguments[1])).Body; if (output.NodeType == ExpressionType.MemberAccess) { if (!output.Type.IsSubclassOf(typeof(Base))) { AddColumnOutput((MemberExpression)output); } else { Query.AddColumnOutput(string.Format("{0}.*", ((MemberExpression)output).Member.Name)); } } else if (output.NodeType == ExpressionType.New) { var ne = (NewExpression)output; foreach (var arg in ne.Arguments) { if (arg is MemberExpression) { if (!arg.Type.IsSubclassOf(typeof(Base))) { AddColumnOutput((MemberExpression)arg); } else { Query.AddColumnOutput(((MemberExpression)arg).Member.Name + ".*"); } } else { Query.AddColumnOutput(((ParameterExpression)arg).Name + ".*"); } } } }
private void VisitSelectMany(MethodCallExpression expression) { ProcessTable(expression); var table = new SqlTable { Alias = ((LambdaExpression)StripQuotes(expression.Arguments[2])).Parameters[1].Name, Name = GetTableName(((LambdaExpression)StripQuotes(expression.Arguments[1])).Body.Type) }; if (!Query.Tables.Contains(table)) Query.Tables.Add(table); }
private void VisitJoin(MethodCallExpression expression) { if (expression.Arguments[0] is ConstantExpression) { var tableName = GetTableName(expression.Arguments[0]); var alias = ((LambdaExpression)StripQuotes(expression.Arguments[2])).Parameters[0].Name; var table = new SqlTable { Alias = alias, Name = tableName }; if (!Query.Tables.Contains(table)) Query.Tables.Add(table); Query.AddColumnOutput(alias + ".*"); } else { Visit(expression.Arguments[0]); } var x1 = (LambdaExpression)StripQuotes(expression.Arguments[2]); var x2 = (LambdaExpression)StripQuotes(expression.Arguments[3]); var m1 = (MemberExpression)x1.Body; var m2 = (MemberExpression)x2.Body; SqlJoin @join = new SqlJoin { JoinAlias = ((LambdaExpression)StripQuotes(expression.Arguments[3])).Parameters[0].Name, JoinTable = GetTableName(expression.Arguments[1].Type), Left = new SqlWhereColumn { Prefix = GetParameterExpression(m1.Expression), Name = GetColumnName(m1.Member) }, Right = new SqlWhereColumn { Prefix = GetParameterExpression(m2.Expression), Name = GetColumnName(m2.Member) } }; Query.Joins.Add(@join); }
private void VisitFirst(MethodCallExpression expression) { Query.Take = 1; if (expression.Arguments[0] is ConstantExpression && ((ConstantExpression)expression.Arguments[0]).Value.GetType().IsSubclassOf(typeof(Base))) { var table = new SqlTable { Name = GetTableName(expression.Arguments[0]), Alias = "t" }; if (!Query.Tables.Contains(table)) Query.Tables.Add(table); } else { Visit(expression.Arguments[0]); } }
private void VisitCount(MethodCallExpression methodCallExpression) { Query.AddColumnOutput("COUNT(*)"); Query.LockColumnOutput = true; if (methodCallExpression.Arguments[0] is ConstantExpression) { var table = new SqlTable { Alias = "c", Name = GetTableName(methodCallExpression.Arguments[0]) }; Query.Tables.Add(table); } else { Visit(methodCallExpression.Arguments[0]); } }
private void ProcessTable(MethodCallExpression expression) { if (expression.Arguments[0].Type.IsSubclassOf(typeof(Base))) { var tableName = GetTableName(expression.Arguments[0]); var alias = ((LambdaExpression)StripQuotes(expression.Arguments[1])).Parameters[0].Name; var table = new SqlTable { Alias = alias, Name = tableName }; if (!Query.Tables.Contains(table)) Query.Tables.Add(table); } else { this.Visit(expression.Arguments[0]); } }
private void ProcessTable(MethodCallExpression expression) { if (expression.Arguments[0].Type.IsSubclassOf(typeof(Base))) { var tableName = GetTableName(expression.Arguments[0]); var alias = ((LambdaExpression)StripQuotes(expression.Arguments[1])).Parameters[0].Name; var table = new SqlTable { Alias = alias, Name = tableName }; if (!Query.Tables.Contains(table)) Query.Tables.Add(table); } else if (IsSubclassOfRawGeneric(typeof(DbQueryable<>), expression.Arguments[0].Type)) { var queryable = ((ConstantExpression)expression.Arguments[0]).Value as IQueryable; var tableName = GetTableName(queryable.ElementType); var alias = ((LambdaExpression)StripQuotes(expression.Arguments[1])).Parameters[0].Name; var table = new SqlTable { Alias = alias, Name = tableName }; if (!Query.Tables.Contains(table)) Query.Tables.Add(table); } else { this.Visit(expression.Arguments[0]); } }