コード例 #1
0
        private (string Query, DynamicParameters Parameters) BuildGetWhereQuery(Expression <Func <TModel, bool> > where, QueryExecutionOptions options = null)
        {
            var limit      = options?.ResultLimit;
            var columnName = options?.ColumnName;

            var language = GetCurrentLanguage();

            var(whereClauseSql, whereClauseParameters) = WhereClauseCompiler.ToSql(where, language: language);
            var parameters = new DynamicParameters(whereClauseParameters);

            var limitSql = limit.HasValue
                ? (language == WhereClauseCompiler.Language.MYSQL) ? $" LIMIT {limit}" : $" TOP {limit}"
                : "";
            var orderByColumnSql = String.IsNullOrEmpty(columnName) ? "" : $"ORDER BY {columnName}";

            string query;

            if (language.Equals(WhereClauseCompiler.Language.MYSQL))
            {
                query = $"SELECT * FROM `{TableName}` WHERE {whereClauseSql}{orderByColumnSql}{limitSql}";
            }
            else
            {
                query = $"SELECT {limitSql} * FROM {TableName} WHERE {whereClauseSql}{orderByColumnSql}";
            }

            return(query, parameters);
        }
コード例 #2
0
        public void MultipleClauses_PreserveOperationHierarchy_NoParentheses()
        {
            //ACT
            var clause = WhereClauseCompiler.ToSql <Model>(x => x.Id_Long_Nullable == null || x.Flag_Nullable == null || x.Date_Nullable == null && x.StringData == null || x.Guid_Nullable == null);

            //ASSERT
            Assert.AreEqual("(([Id_Long_Nullable] IS NULL) OR ([Flag_Nullable] IS NULL) OR ([Date_Nullable] IS NULL) AND ([StringData] IS NULL) OR ([Guid_Nullable] IS NULL))", clause.Sql);
            Assert.AreEqual(0, clause.Parameters.Count);
        }
コード例 #3
0
        public void ParameterLimit_CustomLimit_Exceeded()
        {
            //ARRANGE
            var limit = 5;
            var array = Enumerable.Range(0, limit + 1);

            //ACT
            var clause = WhereClauseCompiler.ToSql <Model>(x => array.Contains(x.Id_Int), parameterLimit: limit);
        }
コード例 #4
0
        public void BoolColumn_CheckFalse()
        {
            //ACT
            var clause = WhereClauseCompiler.ToSql <Model>(x => !x.Flag);

            //ASSERT
            Assert.AreEqual("(NOT ([Flag] = 1))", clause.Sql);
            Assert.AreEqual(0, clause.Parameters.Count);
        }
コード例 #5
0
        public void IntPropertyFromOtherType_In_IntArray_NotSupported()
        {
            //ARRANGE
            var data     = CreateTestDataDto();
            var intArray = new[] { 1, 2, 3, 4 };

            //ACT
            var clause = WhereClauseCompiler.ToSql <Model>(x => intArray.Contains(data.ChildData.ChildData.Id));
        }
コード例 #6
0
        public void IntColumn_LessThan_IntConstant_NormalOrder()
        {
            //ACT
            var clause = WhereClauseCompiler.ToSql <Model>(x => x.Id_Int < 1);

            //ASSERT
            Assert.AreEqual("([Id_Int] < @__P0)", clause.Sql);
            Assert.AreEqual(1, clause.Parameters.Count);
            Assert.AreEqual(1, clause.Parameters["__P0"]);
            Assert.AreEqual(typeof(int), clause.Parameters["__P0"].GetType());
        }
コード例 #7
0
        public void PropertySelectionValidation_SelectedMapperProperty()
        {
            //ACT
            var clause = WhereClauseCompiler.ToSql <Model>(x => x.AMappedPropertyWithMultipleAttributes == (object)1);

            //ASSERT
            Assert.AreEqual($"([AMappedPropertyWithMultipleAttributes] = @__P0)", clause.Sql);
            Assert.AreEqual(1, clause.Parameters.Count);
            Assert.AreEqual(typeof(int), clause.Parameters[$"__P0"].GetType());
            Assert.AreEqual(1, clause.Parameters[$"__P0"]);
        }
コード例 #8
0
        public void StringConstant_EndsWith_StringColumn()
        {
            //ACT
            var clause = WhereClauseCompiler.ToSql <Model>(x => "abc".EndsWith(x.StringData));

            //ASSERT
            Assert.AreEqual("(@__P0 LIKE CONCAT('%',[StringData]))", clause.Sql);
            Assert.AreEqual(1, clause.Parameters.Count);
            Assert.AreEqual(typeof(string), clause.Parameters["__P0"].GetType());
            Assert.AreEqual("abc", clause.Parameters["__P0"]);
        }
コード例 #9
0
        public void StringColumn_StartsWith_StringConstant()
        {
            //ACT
            var clause = WhereClauseCompiler.ToSql <Model>(x => x.StringData.StartsWith("abc"));

            //ASSERT
            Assert.AreEqual("([StringData] LIKE CONCAT(@__P0,'%'))", clause.Sql);
            Assert.AreEqual(1, clause.Parameters.Count);
            Assert.AreEqual(typeof(string), clause.Parameters["__P0"].GetType());
            Assert.AreEqual("abc", clause.Parameters["__P0"]);
        }
コード例 #10
0
        public void NullableBoolColumn_Equals_BoolConstant_ReversedOrder()
        {
            //ACT
            var clause = WhereClauseCompiler.ToSql <Model>(x => true == x.Flag_Nullable);

            //ASSERT
            Assert.AreEqual("(@__P0 = [Flag_Nullable])", clause.Sql);
            Assert.AreEqual(1, clause.Parameters.Count);
            Assert.AreEqual(typeof(bool), clause.Parameters["__P0"].GetType());
            Assert.AreEqual(true, clause.Parameters["__P0"]);
        }
コード例 #11
0
        public void BoolColumn_Equals_BoolConstant_NormalOrder()
        {
            //ACT
            var clause = WhereClauseCompiler.ToSql <Model>(x => x.Flag == true);

            //ASSERT
            Assert.AreEqual("([Flag] = @__P0)", clause.Sql);
            Assert.AreEqual(1, clause.Parameters.Count);
            Assert.AreEqual(true, clause.Parameters["__P0"]);
            Assert.AreEqual(typeof(bool), clause.Parameters["__P0"].GetType());
        }
コード例 #12
0
        public void NullableLongColumn_Equals_IntConstant_ReversedOrder()
        {
            //ACT
            var clause = WhereClauseCompiler.ToSql <Model>(x => 1 == x.Id_Long_Nullable);

            //ASSERT
            Assert.AreEqual("(@__P0 = [Id_Long_Nullable])", clause.Sql);
            Assert.AreEqual(1, clause.Parameters.Count);
            Assert.AreEqual(typeof(long), clause.Parameters["__P0"].GetType());
            Assert.AreEqual((long)1, clause.Parameters["__P0"]);
        }
コード例 #13
0
        public void LongColumn_Equals_IntConstant_NormalOrder()
        {
            //ACT
            var clause = WhereClauseCompiler.ToSql <Model>(x => x.Id_Long == 1);

            //ASSERT
            Assert.AreEqual("([Id_Long] = @__P0)", clause.Sql);
            Assert.AreEqual(1, clause.Parameters.Count);
            Assert.AreEqual(typeof(long), clause.Parameters["__P0"].GetType());
            Assert.AreEqual((long)1, clause.Parameters["__P0"]);
        }
コード例 #14
0
        public void IntColumn_LessOrEqualThan_IntConstant_ReversedOrder()
        {
            //ACT
            var clause = WhereClauseCompiler.ToSql <Model>(x => 1 <= x.Id_Int);

            //ASSERT
            Assert.AreEqual("(@__P0 <= [Id_Int])", clause.Sql);
            Assert.AreEqual(1, clause.Parameters.Count);
            Assert.AreEqual(1, clause.Parameters["__P0"]);
            Assert.AreEqual(typeof(int), clause.Parameters["__P0"].GetType());
        }
コード例 #15
0
        public void ModelWithBase_IdFromBaseComparison()
        {
            //ACT
            var clause = WhereClauseCompiler.ToSql <ModelWithBase>(x => x.Base_Id == 1);

            //ASSERT
            Assert.AreEqual("([Base_Id] = @__P0)", clause.Sql);
            Assert.AreEqual(1, clause.Parameters.Count);
            Assert.AreEqual(typeof(int), clause.Parameters["__P0"].GetType());
            Assert.AreEqual(1, clause.Parameters["__P0"]);
        }
コード例 #16
0
        public void StringColumn_Equals_StringConstant_ReversedOrder()
        {
            //ACT
            var clause = WhereClauseCompiler.ToSql <Model>(x => "abc" == x.StringData);

            //ASSERT
            Assert.AreEqual("(@__P0 = [StringData])", clause.Sql);
            Assert.AreEqual(1, clause.Parameters.Count);
            Assert.AreEqual(typeof(string), clause.Parameters["__P0"].GetType());
            Assert.AreEqual("abc", clause.Parameters["__P0"]);
        }
コード例 #17
0
        public async Task <bool> DeleteWhereAsync(Expression <Func <TModel, bool> > where, QueryExecutionOptions options = null)
        {
            var(whereClauseSql, whereClauseParameters) = WhereClauseCompiler.ToSql(where, language: WhereClauseCompiler.Language.MYSQL);
            var parameters = new DynamicParameters(whereClauseParameters);

            using (var unitOfWork = ConnectionManager.Connect())
            {
                var rowsDeleted = await unitOfWork.Connection.ExecuteAsync($"DELETE FROM {TableName} WHERE {whereClauseSql}", parameters, ConnectionManager.GetCurrentTransaction(), options?.TimeoutInSeconds);

                return(rowsDeleted >= 0);
            }
        }
コード例 #18
0
        public void IntColumn_In_EmptyIntArray()
        {
            //ARRANGE
            var intArray = new int[] { };

            //ACT
            var clause = WhereClauseCompiler.ToSql <Model>(x => intArray.Contains(x.Id_Int));

            //ASSERT
            Assert.AreEqual("(1=0)", clause.Sql);
            Assert.AreEqual(0, clause.Parameters.Count);
        }
コード例 #19
0
        public override sealed bool Delete(IEnumerable <long> ids, QueryExecutionOptions options = null)
        {
            var(whereClauseSql, whereClauseParameters) = WhereClauseCompiler.ToSql <TModel>(x => ids.Contains(x.Id), language: WhereClauseCompiler.Language.MYSQL);
            var parameters = new DynamicParameters(whereClauseParameters);

            using (var unitOfWork = ConnectionManager.Connect())
            {
                var deletedRows = unitOfWork.Connection.Execute($"DELETE FROM {TableName} WHERE {whereClauseSql}", parameters, ConnectionManager.GetCurrentTransaction(), options?.TimeoutInSeconds);

                return(deletedRows >= 0);
            }
        }
コード例 #20
0
        public void NullableDateTimeColumn_Equals_NullNullableDateTimeMember_ReversedOrder()
        {
            //ARRANGE
            var clasWithDate = CreateTestDataDto();

            //ACT
            var clause = WhereClauseCompiler.ToSql <Model>(x => clasWithDate.ChildData.ChildData.Date == x.Date_Nullable);

            //ASSERT
            Assert.AreEqual("([Date_Nullable] IS NULL)", clause.Sql);
            Assert.AreEqual(0, clause.Parameters.Count);
        }
コード例 #21
0
        public void DateTimeColumn_Equals_DateTimeVariable_ReversedOrder()
        {
            //ARRANGE
            var date = DateTime.Now;

            //ACT
            var clause = WhereClauseCompiler.ToSql <Model>(x => date == x.Date);

            //ASSERT
            Assert.AreEqual("(@__P0 = [Date])", clause.Sql);
            Assert.AreEqual(1, clause.Parameters.Count);
            Assert.AreEqual(typeof(DateTime), clause.Parameters["__P0"].GetType());
            Assert.AreEqual(date, clause.Parameters["__P0"]);
        }
コード例 #22
0
        public void NullableDateTimeColumn_Equals_NullableDateTimeMember_NormalOrder()
        {
            //ARRANGE
            var clasWithDate = CreateTestDataDto(DateTime.Now);

            //ACT
            var clause = WhereClauseCompiler.ToSql <Model>(x => x.Date_Nullable == clasWithDate.ChildData.ChildData.Date);

            //ASSERT
            Assert.AreEqual("([Date_Nullable] = @__P0)", clause.Sql);
            Assert.AreEqual(1, clause.Parameters.Count);
            Assert.AreEqual(typeof(DateTime), clause.Parameters["__P0"].GetType());
            Assert.AreEqual(clasWithDate.ChildData.ChildData.Date, clause.Parameters["__P0"]);
        }
コード例 #23
0
        public void ParameterLimit_CustomLimit_NotExceeded()
        {
            //ARRANGE
            var limit = 5;
            var array = Enumerable.Range(0, limit);
            var parameterListToExpect = string.Join(", ", Enumerable.Range(0, limit).Select(x => $"@{WhereClauseCompiler.ParameterName}{x}"));

            //ACT
            var clause = WhereClauseCompiler.ToSql <Model>(x => array.Contains(x.Id_Int), parameterLimit: limit);

            //ASSERT
            Assert.AreEqual($"([Id_Int] IN ({parameterListToExpect}))", clause.Sql);
            Assert.AreEqual(limit, clause.Parameters.Count);
        }
コード例 #24
0
        public void NullableGuidColumn_Equals_Guid_ReversedOrder()
        {
            //ARRANGE
            var guid = Guid.NewGuid();

            //ACT
            var clause = WhereClauseCompiler.ToSql <Model>(x => guid == x.Guid_Nullable);

            //ASSERT
            Assert.AreEqual("(@__P0 = [Guid_Nullable])", clause.Sql);
            Assert.AreEqual(1, clause.Parameters.Count);
            Assert.AreEqual(typeof(Guid), clause.Parameters["__P0"].GetType());
            Assert.AreEqual(guid, clause.Parameters["__P0"]);
        }
コード例 #25
0
        public void NullableDateTimeMember_LessOrEqualThan_NullableDateTimeColumn()
        {
            //ARRANGE
            var clasWithDate = CreateTestDataDto(DateTime.Now);

            //ACT
            var clause = WhereClauseCompiler.ToSql <Model>(x => clasWithDate.ChildData.ChildData.Date <= x.Date_Nullable);

            //ASSERT
            Assert.AreEqual("(@__P0 <= [Date_Nullable])", clause.Sql);
            Assert.AreEqual(1, clause.Parameters.Count);
            Assert.AreEqual(typeof(DateTime), clause.Parameters["__P0"].GetType());
            Assert.AreEqual(clasWithDate.ChildData.ChildData.Date, clause.Parameters["__P0"]);
        }
コード例 #26
0
        public void GuidColumn_Equals_Guid_NormalOrder()
        {
            //ARRANGE
            var guid = Guid.NewGuid();

            //ACT
            var clause = WhereClauseCompiler.ToSql <Model>(x => x.Guid == guid);

            //ASSERT
            Assert.AreEqual("([Guid] = @__P0)", clause.Sql);
            Assert.AreEqual(1, clause.Parameters.Count);
            Assert.AreEqual(typeof(Guid), clause.Parameters["__P0"].GetType());
            Assert.AreEqual(guid, clause.Parameters["__P0"]);
        }
コード例 #27
0
        public void ParameterNames_CustomParameterName()
        {
            //ARRANGE
            string customParamName = "customParam";

            //ACT
            var clause = WhereClauseCompiler.ToSql <Model>(x => x.Id_Int == 1, customParamName);

            //ASSERT
            Assert.AreEqual($"([Id_Int] = @{customParamName}0)", clause.Sql);
            Assert.AreEqual(1, clause.Parameters.Count);
            Assert.AreEqual(typeof(int), clause.Parameters[$"{customParamName}0"].GetType());
            Assert.AreEqual(1, clause.Parameters[$"{customParamName}0"]);
        }
コード例 #28
0
        public void LanguageOptions_MySql()
        {
            //ARRANGE
            var language = WhereClauseCompiler.Language.MYSQL;

            //ACT
            var clause = WhereClauseCompiler.ToSql <Model>(x => x.Id_Int == 1, language: language);

            //ASSERT
            Assert.AreEqual($"(`Id_Int` = @__P0)", clause.Sql);
            Assert.AreEqual(1, clause.Parameters.Count);
            Assert.AreEqual(typeof(int), clause.Parameters[$"__P0"].GetType());
            Assert.AreEqual(1, clause.Parameters[$"__P0"]);
        }
コード例 #29
0
        public void ModelWithBase_IdFromBaseComparison_OtherClassWithSameBase()
        {
            //ARRANGE
            var otherClass = new OtherClassWithSameBase {
                Base_Id = 1
            };

            //ACT
            var clause = WhereClauseCompiler.ToSql <ModelWithBase>(x => x.Base_Id == otherClass.Base_Id);

            //ASSERT
            Assert.AreEqual("([Base_Id] = @__P0)", clause.Sql);
            Assert.AreEqual(1, clause.Parameters.Count);
            Assert.AreEqual(typeof(int), clause.Parameters["__P0"].GetType());
            Assert.AreEqual(1, clause.Parameters["__P0"]);
        }
コード例 #30
0
        public void Model_IdComparison_SameModelButInstanced()
        {
            //ARRANGE
            var instanced = new ModelWithBase {
                Base_Id = 1
            };

            //ACT
            var clause = WhereClauseCompiler.ToSql <ModelWithBase>(x => x.Base_Id == instanced.Base_Id);

            //ASSERT
            Assert.AreEqual("([Base_Id] = @__P0)", clause.Sql);
            Assert.AreEqual(1, clause.Parameters.Count);
            Assert.AreEqual(typeof(int), clause.Parameters["__P0"].GetType());
            Assert.AreEqual(1, clause.Parameters["__P0"]);
        }