private TResult ExecuteFirstFunc <TResult>(MethodCallExpression methodCall) { List <T> data = null; if (methodCall.Arguments.Count == 2) { var lambda = (methodCall.Arguments[1] as UnaryExpression).Operand as LambdaExpression; SelectExpressionResolver <T> selectResolver = new SelectExpressionResolver <T>(); WhereExpressionResolver <T> whereResolver = new WhereExpressionResolver <T>(); whereResolver.Resolve(lambda); if (methodCall.Arguments[0] is MethodCallExpression) { ExpressionResolverManager <T> manager = new ExpressionResolverManager <T>(methodCall.Arguments[0] as MethodCallExpression).Resolve(); var sql = $"SELECT TOP 1 {selectResolver.SQL} FROM {typeof(T).TableName()} WHERE {$"{whereResolver.SQL} AND {manager.WhereResolver.SQL}"} {manager.GroupByResolver.SQL} {manager.OrderByResolver.SQL}"; var parameters = whereResolver.SqlParameters.Concat(manager.WhereResolver.SqlParameters); data = DatabaseOperator.ExecuteReader <T>(DatabaseOperator.connection, sql, parameters.ToArray()); } else if (methodCall.Arguments[0] is ConstantExpression) { var sql = $"SELECT TOP 1 {selectResolver.SQL} FROM {typeof(T).TableName()} WHERE {whereResolver.SQL}"; data = DatabaseOperator.ExecuteReader <T>(DatabaseOperator.connection, sql, whereResolver.SqlParameters); } } else if (methodCall.Arguments.Count == 1) { var manager = new ExpressionResolverManager <T>(methodCall.Arguments[0] as MethodCallExpression).Resolve(); var sql = $"SELECT TOP 1 {manager.SelectResolver.SQL} FROM {typeof(T).TableName()} WHERE {manager.WhereResolver.SQL} {manager.GroupByResolver.SQL} {manager.OrderByResolver.SQL}"; data = DatabaseOperator.ExecuteReader <T>(DatabaseOperator.connection, sql, manager.WhereResolver.SqlParameters); } var ret = Convert.ChangeType((dynamic)data[0], typeof(T)); return((TResult)(object)ret); }
private TResult ExecuteNoneFunc <TResult>() { SelectExpressionResolver <T> selectResolver = new SelectExpressionResolver <T>(); string sql = $"SELECT {selectResolver.SQL} FROM {typeof(T).TableName()}"; var data = DatabaseOperator.ExecuteReader <T>(DatabaseOperator.connection, sql); return((TResult)(object)data); }