コード例 #1
0
        public void ExecuteReader(IDbCommandStruct commandStruct, Action <IDataReader> readProcessor)
        {
            if (commandStruct == null)
            {
                throw new ArgumentNullException(nameof(commandStruct));
            }
            if (readProcessor == null)
            {
                throw new ArgumentNullException(nameof(readProcessor));
            }

            var dbConnection = Allocate();

            try
            {
                dbConnection.EnsureConnection();
                using (var reader = dbConnection.ExecuteReader(commandStruct.CommandText, CommandType.Text, commandStruct.CommandTimeout, commandStruct.Parameters))
                {
                    readProcessor(reader);
                }
            }
            finally
            {
                Release(dbConnection);
            }
        }
コード例 #2
0
        public static void Where <T>(this IDbCommandStruct @struct, Expression <Func <T, bool> > expression)
        {
            if (@struct == null)
            {
                throw new ArgumentNullException(nameof(@struct));
            }
            if (expression == null)
            {
                throw new ArgumentNullException(nameof(expression));
            }

            int pIndex = 0;

            @struct.Condition = Accept(@struct, expression.Body, ref pIndex);
        }
コード例 #3
0
        public int ExecuteNonQuery(IDbCommandStruct commandStruct)
        {
            if (commandStruct == null)
            {
                throw new ArgumentNullException(nameof(commandStruct));
            }

            var dbConnection = Allocate();

            try
            {
                dbConnection.EnsureConnection();
                return(dbConnection.ExecuteNonQuery(commandStruct.CommandText, CommandType.Text, commandStruct.CommandTimeout, commandStruct.Parameters));
            }
            finally
            {
                Release(dbConnection);
            }
        }
コード例 #4
0
ファイル: RowAdapter.cs プロジェクト: zz1231118/Framework
        public static List <T> Load <T>(IDbCommandStruct <T> commandStruct)
            where T : RowAdapter, new()
        {
            if (commandStruct == null)
            {
                throw new ArgumentNullException(nameof(commandStruct));
            }

            if (!EntitySchemaManager.TryGetSchema <T>(out IEntitySchema view))
            {
                throw new ArgumentException(string.Format("not found {0}:{1}", nameof(IEntitySchema), typeof(T).FullName));
            }
            if (!DbConnectionManager.TryGet(view.ConnectKey, out DbConnectionProvider connectionProvider))
            {
                throw new InvalidOperationException("not found DbProvider:" + view.ConnectKey);
            }

            return(Load <T>(connectionProvider, commandStruct));
        }
コード例 #5
0
        public static List <T> Load <T>(IDbProvider dbProvider, IDbCommandStruct commandStruct)
            where T : RowAdapter, new()
        {
            if (dbProvider == null)
            {
                throw new ArgumentNullException(nameof(dbProvider));
            }
            if (commandStruct == null)
            {
                throw new ArgumentNullException(nameof(commandStruct));
            }

            var rows = DbHelper.Load <T>(dbProvider, commandStruct);

            foreach (var row in rows)
            {
                row.saveUsage = SaveUsage.Update;
                row.Initialize();
            }
            return(rows);
        }
コード例 #6
0
ファイル: RowAdapter.cs プロジェクト: zz1231118/Framework
        public static List <T> Load <T>(DbConnectionProvider connectionProvider, IDbCommandStruct <T> commandStruct)
            where T : RowAdapter, new()
        {
            if (connectionProvider == null)
            {
                throw new ArgumentNullException(nameof(connectionProvider));
            }
            if (commandStruct == null)
            {
                throw new ArgumentNullException(nameof(commandStruct));
            }

            var rows = connectionProvider.Select <T>(commandStruct);

            foreach (var row in rows)
            {
                row._saveUsage = SaveUsage.Update;
                row.Initialize();
            }
            return(rows);
        }
コード例 #7
0
        public static void GroupBy <T>(this IDbCommandStruct @struct, Expression <Func <T, object> > expression)
        {
            if (@struct == null)
            {
                throw new ArgumentNullException(nameof(@struct));
            }
            if (expression == null)
            {
                throw new ArgumentNullException(nameof(expression));
            }

            MemberExpression memberExpression;

            switch (expression.Body)
            {
            case MemberExpression other:
                memberExpression = other;
                break;

            case UnaryExpression other:
                if (other.NodeType == ExpressionType.Convert && other.Operand is MemberExpression m)
                {
                    memberExpression = m;
                    break;
                }
                throw new InvalidOperationException("invalid expression");

            default:
                throw new InvalidOperationException("invalid expression");
            }

            var groups = @struct.Groups?.ToList() ?? new List <SqlMemberExpression>();

            groups.Add(SqlExpression.Member(memberExpression.Member.Name));
            @struct.Groups = groups.ToArray();
        }
コード例 #8
0
        public static void OrderBy <T>(this IDbCommandStruct @struct, Expression <Func <T, object> > expression, bool ascending = true)
        {
            if (@struct == null)
            {
                throw new ArgumentNullException(nameof(@struct));
            }
            if (expression == null)
            {
                throw new ArgumentNullException(nameof(expression));
            }

            MemberExpression memberExpression;

            switch (expression.Body)
            {
            case MemberExpression other:
                memberExpression = other;
                break;

            case UnaryExpression other:
                if (other.NodeType == ExpressionType.Convert && other.Operand is MemberExpression m)
                {
                    memberExpression = m;
                    break;
                }
                throw new InvalidOperationException("invalid expression");

            default:
                throw new InvalidOperationException("invalid expression");
            }

            var sortOrders = @struct.SortOrders?.ToList() ?? new List <IDbSortClause>();

            sortOrders.Add(new DbSortClause(SqlExpression.Member(memberExpression.Member.Name), ascending));
            @struct.SortOrders = sortOrders.ToArray();
        }
コード例 #9
0
        public static List <T> Select <T>(this DbConnectionProvider connectionProvider, IDbCommandStruct commandStruct)
        {
            if (commandStruct == null)
            {
                throw new ArgumentNullException(nameof(commandStruct));
            }

            return(Select <T>(connectionProvider, commandStruct.CommandText, CommandType.Text, commandStruct.CommandTimeout, commandStruct.Parameters));
        }
コード例 #10
0
        private static SqlExpression Accept(IDbCommandStruct @struct, Expression expression, ref int pIndex)
        {
            if (expression is BinaryExpression binary)
            {
                SqlExpression lexpre = Accept(@struct, binary.Left, ref pIndex);
                SqlExpression rexpre = Accept(@struct, binary.Right, ref pIndex);
                switch (binary.NodeType)
                {
                case ExpressionType.AndAlso:
                    return(SqlExpression.And(lexpre, rexpre));

                case ExpressionType.OrElse:
                    return(SqlExpression.Or(lexpre, rexpre));

                case ExpressionType.GreaterThan:
                    return(SqlExpression.GreaterThan(lexpre, rexpre));

                case ExpressionType.GreaterThanOrEqual:
                    return(SqlExpression.GreaterThanOrEqual(lexpre, rexpre));

                case ExpressionType.Equal:
                    switch (rexpre)
                    {
                    case SqlConstantExpression constant when constant.Value is null:
                        return(SqlExpression.Is(lexpre, rexpre));

                    default:
                        return(SqlExpression.Equal(lexpre, rexpre));
                    }

                case ExpressionType.NotEqual:
                    switch (rexpre)
                    {
                    case SqlConstantExpression constant when constant.Value is null:
                        return(SqlExpression.Not(SqlExpression.Is(lexpre, rexpre)));

                    default:
                        return(SqlExpression.NotEqual(lexpre, rexpre));
                    }

                case ExpressionType.LessThanOrEqual:
                    return(SqlExpression.LessThanOrEqual(lexpre, rexpre));

                case ExpressionType.LessThan:
                    return(SqlExpression.LessThan(lexpre, rexpre));

                default:
                    throw new ArgumentException(nameof(binary.NodeType));
                }
            }
            else if (expression is MemberExpression member)
            {
                if (member.Expression.NodeType == ExpressionType.Parameter)
                {
                    return(SqlExpression.Member(member.Member.Name));
                }
                else
                {
                    var name   = "var" + pIndex++;
                    var parent = member.Expression?.GetValue();
                    var value  = member.Member.GetValue(parent);
                    @struct.AddParameter(name, value);
                    return(SqlExpression.Paramter(name));
                }
            }
            else if (expression is UnaryExpression unary)
            {
                var node = Accept(@struct, unary.Operand, ref pIndex);
                if (unary.NodeType == ExpressionType.Not)
                {
                    return(SqlExpression.Not(node));
                }
                else if (unary.NodeType == ExpressionType.Negate)
                {
                    return(SqlExpression.Negate(node));
                }
                else if (unary.NodeType == ExpressionType.Convert)
                {
                    return(node);
                }
                else
                {
                    throw new ArgumentException();
                }
            }
            else if (expression is ConstantExpression constant)
            {
                if (constant.Value == null)
                {
                    return(SqlExpression.Constant(null));
                }

                var name = "var" + pIndex++;
                @struct.AddParameter(name, constant.Value);
                return(SqlExpression.Paramter(name));
            }
            else if (expression is NewExpression newexpr)
            {
                var objParams = new object[newexpr.Arguments.Count];
                for (int i = 0; i < objParams.Length; i++)
                {
                    objParams[i] = newexpr.Arguments[i].GetValue();
                }

                var obj = newexpr.Constructor.Invoke(objParams);
                return(SqlExpression.Constant(obj));
            }
            else if (expression is MethodCallExpression methodCall)
            {
                if (methodCall.Method.Name == "Contains" && methodCall.Method.ReturnType == typeof(bool) && methodCall.Arguments.Count == 1)
                {
                    var parameters = methodCall.Method.GetParameters();
                    if (parameters.Length == 1)
                    {
                        var collection  = GetValue(methodCall.Object) as IEnumerable;
                        var expressions = new List <SqlExpression>();
                        foreach (var value in collection)
                        {
                            expressions.Add(SqlExpression.Constant(value));
                        }

                        int inIndex  = 0;
                        var argument = Accept(@struct, methodCall.Arguments[0], ref inIndex);
                        var newArray = SqlExpression.NewArray(expressions);
                        return(SqlExpression.In(argument, newArray));
                    }
                }
            }

            throw new ArgumentException();
        }