public TResult Min <TResult>(Expression <Func <T, TResult> > minExpression)
 {
     SqlProvider.FormatMin(minExpression);
     return(DbCon.QuerySingleOrDefault <TResult>(SqlProvider.SqlString, SqlProvider.Params, dbTransaction));
 }
示例#2
0
        /// <summary>
        /// 反射执行需要指向T类型的函数
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="sqlProvider"></param>
        /// <param name="methodName"></param>
        public void FormatSend <T>(QuerySet <T> querySet, string methodName)
        {
            SqlProvider sqlProvider = querySet.SqlProvider;

            //写入重新生成后的条件
            if (WhereExpression != null && WhereExpression.Any())
            {
                querySet.WhereExpressionList.AddRange(WhereExpression);
            }
            //因为表达式的原因,递归获取连表默认会倒序
            if (sqlProvider.JoinList.Any())
            {
                sqlProvider.JoinList.Reverse();
            }
            switch (methodName)
            {
            case "Count":
            {
                sqlProvider.FormatCount();
            }
            break;

            case "Sum":
            {
                var lambda = this.expression.Arguments[0].GetLambdaExpression();
                sqlProvider.FormatSum(lambda);
            }
            break;

            case "Min":
            {
                var lambda = this.expression.Arguments[0].GetLambdaExpression();
                sqlProvider.FormatMin(lambda);
            }
            break;

            case "Max":
            {
                var lambda = this.expression.Arguments[0].GetLambdaExpression();
                sqlProvider.FormatMax(lambda);
            }
            break;

            case "Get":
            {
                LambdaExpression lambda = default(LambdaExpression);
                if (this.expression.Arguments.Count == 1)
                {
                    lambda          = this.expression.Arguments[0].GetLambdaExpression();
                    this.ReturnType = lambda.ReturnType;
                }
                else if (this.expression.Arguments.Count == 0)                                //无自定义列表返回
                {
                    lambda          = null;
                    this.ReturnType = this.expression.Method.ReturnType;
                }
                else
                {
                    //带if判断
                    if (this.expression.Arguments[0].ToConvertAndGetValue().Equals(true))
                    {
                        lambda = this.expression.Arguments[1].GetLambdaExpression();
                    }
                    else
                    {
                        lambda = this.expression.Arguments[2].GetLambdaExpression();
                    }
                    this.ReturnType = lambda.ReturnType;
                }
                sqlProvider.Context.Set.SelectExpression = lambda;
                sqlProvider.FormatGet <T>();
            }
            break;

            case "ToList":
            {
                LambdaExpression lambda = default(LambdaExpression);
                if (this.expression.Arguments.Count == 1)
                {
                    lambda          = this.expression.Arguments[0].GetLambdaExpression();
                    this.ReturnType = lambda.ReturnType;
                }
                else if (this.expression.Arguments.Count == 0)                                //无自定义列表返回
                {
                    lambda          = null;
                    this.ReturnType = this.expression.Method.ReturnType.GenericTypeArguments[0];
                }
                else
                {
                    //带if判断
                    if (this.expression.Arguments[0].ToConvertAndGetValue().Equals(true))
                    {
                        lambda = this.expression.Arguments[1].GetLambdaExpression();
                    }
                    else
                    {
                        lambda = this.expression.Arguments[2].GetLambdaExpression();
                    }
                    this.ReturnType = lambda.ReturnType;
                }
                sqlProvider.Context.Set.SelectExpression = lambda;
                sqlProvider.FormatToList <T>();
            }
            break;

            default:
                throw new DapperExtensionException("Kogel.Dapper.Extension中子查询不支持的扩展函数");
            }
            //得到解析的sql和param对象
            string sql   = sqlProvider.SqlString;
            var    param = ToSubqueryParam(sqlProvider.Params, ref sql);

            _sqlCmd.Append(sql);
            this.Param.AddDynamicParams(param);
        }