public static Task <int> UpdateAsync <T>(this IDbConnection connection, T data, Expression <Func <T, bool> > predicate, bool setIdentity, params Expression <Func <T, object> >[] properties)
        {
            if (connection == null)
            {
                throw new ArgumentNullException(nameof(connection));
            }
            if (data == null)
            {
                throw new ArgumentNullException(nameof(data));
            }
            if (predicate == null)
            {
                throw new ArgumentNullException(nameof(predicate));
            }
            if (properties == null)
            {
                throw new ArgumentNullException(nameof(properties));
            }

            var dbKind = connection.GetDbKind();
            var update = PrimitiveSql.CreateUpdate(dbKind, setIdentity, properties);

            var where = PredicateSql.From(dbKind, predicate);
            var param   = where.Parameter.Merge(data, properties);
            var builder = new StringBuilder();

            builder.AppendLine(update);
            builder.AppendLine(nameof(where));
            builder.Append($"    {where.Statement}");
            return(connection.ExecuteAsync(builder.ToString(), param));
        }
        public static async Task <IReadOnlyList <T> > SelectAsync <T>(this IDbConnection connection, Expression <Func <T, bool> > predicate, params Expression <Func <T, object> >[] properties)
        {
            if (connection == null)
            {
                throw new ArgumentNullException(nameof(connection));
            }
            if (predicate == null)
            {
                throw new ArgumentNullException(nameof(predicate));
            }
            if (properties == null)
            {
                throw new ArgumentNullException(nameof(properties));
            }

            var select = PrimitiveSql.CreateSelect(properties);

            var where = PredicateSql.From(connection.GetDbKind(), predicate);
            var builder = new StringBuilder();

            builder.AppendLine(select);
            builder.AppendLine(nameof(where));
            builder.Append($"    {where.Statement}");
            var result = await connection.QueryAsync <T>(builder.ToString(), where.Parameter).ConfigureAwait(false);

            return(result as IReadOnlyList <T>);
        }
        public void Null()
        {
            var actual = PredicateSql.From <Person>(DbKind.SqlServer, x => x.Name == null);

            var expectStatement = "名前 is null";
            IDictionary <string, object> expectParameter = new ExpandoObject();

            actual.Parameter.Is(expectParameter);
            actual.Statement.Is(expectStatement);
        }
示例#4
0
        /// <summary>
        /// 指定されたテーブルから指定の条件に一致するレコードを取得します。
        /// </summary>
        /// <typeparam name="T">テーブルにマッピングされた型</typeparam>
        /// <param name="predicate">抽出条件</param>
        /// <param name="properties">取得対象の列</param>
        /// <returns>取得したレコード</returns>
        public virtual IReadOnlyList <T> Select <T>(Expression <Func <T, bool> > predicate, Expression <Func <T, object> > properties)
        {
            var select = PrimitiveSql.CreateSelect(properties);

            var where = PredicateSql.From(this.DbKind, predicate);
            var builder = new StringBuilder();

            builder.AppendLine(select);
            builder.AppendLine(nameof(where));
            builder.Append($"    {where.Statement}");
            return(this.Connection.Query <T>(builder.ToString(), where.Parameter, this.Transaction, true, this.Timeout) as IReadOnlyList <T>);
        }
        public void 以下()
        {
            var actual = PredicateSql.From <Person>(DbKind.SqlServer, x => x.Id <= 1);

            var expectStatement = "Id <= @p0";
            IDictionary <string, object> expectParameter = new ExpandoObject();

            expectParameter.Add("p0", 1);

            actual.Parameter.Is(expectParameter);
            actual.Statement.Is(expectStatement);
        }
        public void 右辺が静的プロパティ()
        {
            var actual = PredicateSql.From <Person>(DbKind.SqlServer, x => x.Age == SomeClass.StaticProperty);

            var expectStatement = "Age = @p0";
            IDictionary <string, object> expectParameter = new ExpandoObject();

            expectParameter.Add("p0", SomeClass.StaticProperty);

            actual.Parameter.Is(expectParameter);
            actual.Statement.Is(expectStatement);
        }
        public void InverseBoolean()
        {
            var actual = PredicateSql.From <Person>(DbKind.SqlServer, x => !x.HasChildren);

            var expectStatement = "HasChildren <> @p0";
            IDictionary <string, object> expectParameter = new ExpandoObject();

            expectParameter.Add("p0", true);

            actual.Parameter.Is(expectParameter);
            actual.Statement.Is(expectStatement);
        }
        public void 右辺がコンストラクタ()
        {
            var actual = PredicateSql.From <Person>(DbKind.SqlServer, x => x.Name == new string('a', 3));

            var expectStatement = "名前 = @p0";
            IDictionary <string, object> expectParameter = new ExpandoObject();

            expectParameter.Add("p0", "aaa");

            actual.Parameter.Is(expectParameter);
            actual.Statement.Is(expectStatement);
        }
        public void 右辺が静的メソッド()
        {
            var actual = PredicateSql.From <Person>(DbKind.SqlServer, x => x.Name == SomeClass.StaticMethod());

            var expectStatement = "名前 = @p0";
            IDictionary <string, object> expectParameter = new ExpandoObject();

            expectParameter.Add("p0", SomeClass.StaticMethod());

            actual.Parameter.Is(expectParameter);
            actual.Statement.Is(expectStatement);
        }
示例#10
0
        /// <summary>
        /// 指定されたテーブルにおいて指定の条件に一致するレコード数を取得します。
        /// </summary>
        /// <typeparam name="T">テーブルにマッピングされた型</typeparam>
        /// <param name="predicate">抽出条件</param>
        /// <returns>レコード数</returns>
        public virtual ulong Count <T>(Expression <Func <T, bool> > predicate)
        {
            var count = PrimitiveSql.CreateCount <T>();

            var where = PredicateSql.From(this.DbKind, predicate);
            var builder = new StringBuilder();

            builder.AppendLine(count);
            builder.AppendLine(nameof(where));
            builder.Append($"    {where.Statement}");
            return(this.Connection.ExecuteScalar <ulong>(builder.ToString(), where.Parameter, this.Transaction, this.Timeout));
        }
示例#11
0
        /// <summary>
        /// 指定されたテーブルから指定の条件に一致するレコードを非同期的に削除します。
        /// </summary>
        /// <typeparam name="T">テーブルにマッピングされた型</typeparam>
        /// <param name="predicate">削除条件</param>
        /// <returns>影響した行数</returns>
        public virtual Task <int> DeleteAsync <T>(Expression <Func <T, bool> > predicate)
        {
            var delete = PrimitiveSql.CreateDelete <T>();

            var where = PredicateSql.From(this.DbKind, predicate);
            var builder = new StringBuilder();

            builder.AppendLine(delete);
            builder.AppendLine(nameof(where));
            builder.Append($"    {where.Statement}");
            return(this.Connection.ExecuteAsync(builder.ToString(), where.Parameter, this.Transaction, this.Timeout));
        }
        public void 右辺がインデクサ()
        {
            var ids    = new [] { 1, 2, 3 };
            var actual = PredicateSql.From <Person>(DbKind.SqlServer, x => x.Id == ids[0]);

            var expectStatement = "Id = @p0";
            IDictionary <string, object> expectParameter = new ExpandoObject();

            expectParameter.Add("p0", ids[0]);

            actual.Parameter.Is(expectParameter);
            actual.Statement.Is(expectStatement);
        }
        public void 右辺がラムダ式()
        {
            Func <int, string> getName = x => x.ToString();
            var actual = PredicateSql.From <Person>(DbKind.SqlServer, x => x.Name == getName(123));

            var expectStatement = "名前 = @p0";
            IDictionary <string, object> expectParameter = new ExpandoObject();

            expectParameter.Add("p0", "123");

            actual.Parameter.Is(expectParameter);
            actual.Statement.Is(expectStatement);
        }
        public void Contains()
        {
            var value  = Enumerable.Range(0, 3).Cast <object>().ToArray();
            var actual = PredicateSql.From <Person>(DbKind.SqlServer, x => value.Contains(x.Id));

            var expectStatement = "Id in @p0";
            IDictionary <string, object> expectParameter = new ExpandoObject();

            expectParameter.Add("p0", value);

            actual.Parameter.IsStructuralEqual(expectParameter);
            actual.Statement.Is(expectStatement);
        }
        public void Or()
        {
            var actual = PredicateSql.From <Person>(DbKind.SqlServer, x => x.Id > 1 || x.Name == "xin9le");

            var expectStatement = "Id > @p0 or 名前 = @p1";
            IDictionary <string, object> expectParameter = new ExpandoObject();

            expectParameter.Add("p0", 1);
            expectParameter.Add("p1", "xin9le");

            actual.Parameter.Is(expectParameter);
            actual.Statement.Is(expectStatement);
        }
示例#16
0
        /// <summary>
        /// 指定の条件に一致するレコードを指定された情報で非同期的に更新します。
        /// </summary>
        /// <typeparam name="T">テーブルの型</typeparam>
        /// <param name="data">更新するデータ</param>
        /// <param name="predicate">更新条件</param>
        /// <param name="properties">更新する列にマッピングされるプロパティ式のコレクション</param>
        /// <param name="setIdentity">自動採番のID列に値を設定するかどうか</param>
        /// <returns>影響した行数</returns>
        public virtual Task <int> UpdateAsync <T>(T data, Expression <Func <T, bool> > predicate, Expression <Func <T, object> > properties, bool setIdentity)
        {
            var update = PrimitiveSql.CreateUpdate(this.DbKind, properties, setIdentity);

            var where = PredicateSql.From(this.DbKind, predicate);
            var param   = where.Parameter.Merge(data, properties);
            var builder = new StringBuilder();

            builder.AppendLine(update);
            builder.AppendLine(nameof(where));
            builder.Append($"    {where.Statement}");
            return(this.Connection.ExecuteAsync(builder.ToString(), param, this.Transaction, this.Timeout));
        }
        public void AndOr2()
        {
            var actual = PredicateSql.From <Person>(DbKind.SqlServer, x => x.Id > 1 && (x.Name == "xin9le" || x.Age <= 30));

            var expectStatement = "Id > @p0 and (名前 = @p1 or Age <= @p2)";
            IDictionary <string, object> expectParameter = new ExpandoObject();

            expectParameter.Add("p0", 1);
            expectParameter.Add("p1", "xin9le");
            expectParameter.Add("p2", 30);

            actual.Parameter.Is(expectParameter);
            actual.Statement.Is(expectStatement);
        }
        public void BooleanAndOr()
        {
            var actual = PredicateSql.From <Person>(DbKind.SqlServer, x => x.HasChildren == true || x.Id != 0 || x.Name == "xin9le" && !x.HasChildren);

            var expectStatement = "HasChildren = @p0 or Id <> @p1 or (名前 = @p2 and HasChildren <> @p3)";
            IDictionary <string, object> expectParameter = new ExpandoObject();

            expectParameter.Add("p0", true);
            expectParameter.Add("p1", 0);
            expectParameter.Add("p2", "xin9le");
            expectParameter.Add("p3", true);

            actual.Parameter.Is(expectParameter);
            actual.Statement.Is(expectStatement);
        }