public void ShouldAllowForSqlKeyWordsAsFieldNames()
        {
            var helper = new MergeQueryObjectTestHelper();

            helper.DataService.DropTable();
            helper.DataService.CreateCompositeKeyTableWithSqlKeyWords();

            var dtos = new[]
            {
                new SampleCompositeKeyWithKeyWordsDto
                {
                    Exec = 1,
                    Pk2  = "A",
                    Drop = new DateTime(2020, 3, 1),
                    From = "jv",
                }
            };

            var request = new MergeRequest <SampleCompositeKeyWithKeyWordsDto>
            {
                DataToMerge                     = dtos,
                TargetTableName                 = "dbo.Sample",
                UseRealTempTable                = false,
                PrimaryKeyExpression            = t => new object[] { t.Exec, t.Pk2 },
                KeepPrimaryKeyInInsertStatement = true,
                WhenNotMatchedDeleteBehavior    = DeleteBehavior.Delete
            };

            helper.DataService.Merge(request);

            var sampleDtos = helper
                             .DataService
                             .GetAllSampleDtos <SampleCompositeKeyWithKeyWordsDto>().ToArray();

            var firstDto = sampleDtos.First(x => x.Exec == 1);

            firstDto.Pk2.Should().Be("A");
            firstDto.Drop.Should().Be(new DateTime(2020, 3, 1));
            firstDto.From.Should().Be("jv");
        }
        public void ShouldAllowForSqlKeyWordsInFilter()
        {
            var helper = new MergeQueryObjectTestHelper();

            helper.DataService.DropTable();
            helper.DataService.CreateCompositeKeyTableWithSqlKeyWords();

            var dtosSetup = new[]
            {
                new SampleCompositeKeyWithKeyWordsDto
                {
                    Exec = 2,
                    Pk2  = "B",
                    Drop = new DateTime(2020, 4, 1),
                    From = "jv",
                }
            };

            var requestSetup = new MergeRequest <SampleCompositeKeyWithKeyWordsDto>
            {
                DataToMerge                     = dtosSetup,
                TargetTableName                 = "dbo.Sample",
                UseRealTempTable                = false,
                PrimaryKeyExpression            = t => new object[] { t.Exec, t.Pk2 },
                KeepPrimaryKeyInInsertStatement = true,
                WhenNotMatchedDeleteBehavior    = DeleteBehavior.None
            };

            helper.DataService.Merge(requestSetup);


            var dtos = new[]
            {
                new SampleCompositeKeyWithKeyWordsDto
                {
                    Exec = 1,
                    Pk2  = "A",
                    Drop = new DateTime(2020, 3, 1),
                    From = "jv",
                }
            };

            var startFilter = new DateTime(2020, 3, 1);
            var endFilter   = new DateTime(2020, 3, 31);

            var request = new MergeRequest <SampleCompositeKeyWithKeyWordsDto>
            {
                DataToMerge                     = dtos,
                TargetTableName                 = "dbo.Sample",
                UseRealTempTable                = false,
                PrimaryKeyExpression            = t => new object[] { t.Exec, t.Pk2 },
                KeepPrimaryKeyInInsertStatement = true,
                TargetDataSetFilter             = t => t.Drop >= startFilter && t.Drop <= endFilter,
                WhenNotMatchedDeleteBehavior    = DeleteBehavior.Delete
            };

            helper.DataService.Merge(request);

            var sampleDtos = helper
                             .DataService
                             .GetAllSampleDtos <SampleCompositeKeyWithKeyWordsDto>().ToArray();

            sampleDtos.Length.Should().Be(2);

            var firstDto = sampleDtos.First(x => x.Exec == 1);

            firstDto.Pk2.Should().Be("A");
            firstDto.Drop.Should().Be(new DateTime(2020, 3, 1));
            firstDto.From.Should().Be("jv");

            var secondDtoNotDeletedByFilter = sampleDtos.First(x => x.Exec == 2);

            secondDtoNotDeletedByFilter.Pk2.Should().Be("B");
            secondDtoNotDeletedByFilter.Drop.Should().Be(new DateTime(2020, 4, 1));
            secondDtoNotDeletedByFilter.From.Should().Be("jv");
        }
        public void BasicUsageControllingBulkLoadOperation()
        {
            var helper = new MergeQueryObjectTestHelper();

            helper.DataService.DropTable();
            helper.DataService.CreateSingleSurrogateKeyTable();

            helper.DataService.Insert(new SampleSurrogateKey
            {
                Pk           = 1,
                TextValue    = "JJ",
                IntValue     = 1,
                DecimalValue = 1
            });

            var dtos = new[]
            {
                new SampleSurrogateKeyDifferentNamesDto
                {
                    Pk                = 1,
                    TextValueExtra    = "JJ",
                    IntValueExtra     = 100,
                    DecimalValueExtra = 100.99m
                },
                new SampleSurrogateKeyDifferentNamesDto
                {
                    Pk                = 0,
                    TextValueExtra    = "BB",
                    IntValueExtra     = 200,
                    DecimalValueExtra = 200.99m
                }
            };

            var request = new MergeRequest <SampleSurrogateKeyDifferentNamesDto>
            {
                DataToMerge                     = dtos,
                TargetTableName                 = "dbo.Sample",
                UseRealTempTable                = false,
                PrimaryKeyExpression            = t => new object[] { t.Pk },
                KeepPrimaryKeyInInsertStatement = false,
                WhenNotMatchedDeleteBehavior    = DeleteBehavior.Delete,
                OnMergeUpdateActive             = true,
                OnMergeInsertActive             = true,
                BulkLoaderOptions               =
                    t => t.With(c => c.TextValueExtra, "TextValue")
                    .With(c => c.IntValueExtra, "IntValue")
                    .With(c => c.DecimalValueExtra, "DecimalValue")
            };

            helper.DataService.Merge(request);

            var sampleDtos = helper
                             .DataService
                             .GetAllSampleDtos <SampleSurrogateKey>()
                             .ToArray();

            sampleDtos.Length.Should().Be(2);

            var firstDto = sampleDtos.First(x => x.TextValue == "JJ");

            firstDto.Pk.Should().BeGreaterThan(0);
            firstDto.IntValue.Should().Be(100);
            firstDto.DecimalValue.Should().Be(100.99m);

            var secondDto = sampleDtos.First(x => x.TextValue == "BB");

            secondDto.Pk.Should().BeGreaterThan(0);
            secondDto.IntValue.Should().Be(200);
            secondDto.DecimalValue.Should().Be(200.99m);
        }
        public void BasicUsageSimpleMerge()
        {
            var helper = new MergeQueryObjectTestHelper();

            helper.DataService.DropTable();
            helper.DataService.CreateSingleSurrogateKeyTable();

            helper.DataService.Insert(new SampleSurrogateKey
            {
                Pk           = 1,
                TextValue    = "JJ",
                IntValue     = 1,
                DecimalValue = 1
            });

            var dtos = new[]
            {
                new SampleSurrogateKey
                {
                    Pk           = 1,
                    TextValue    = "JJ",
                    IntValue     = 100,
                    DecimalValue = 100.99m
                },
                new SampleSurrogateKey
                {
                    Pk           = 0,
                    TextValue    = "BB",
                    IntValue     = 200,
                    DecimalValue = 200.99m
                }
            };

            var request = new MergeRequest <SampleSurrogateKey>
            {
                DataToMerge                     = dtos,
                TargetTableName                 = "dbo.Sample",
                UseRealTempTable                = false,
                PrimaryKeyExpression            = t => new object[] { t.Pk },
                KeepPrimaryKeyInInsertStatement = false
            };

            helper.DataService.Merge(request);

            var sampleDtos = helper
                             .DataService
                             .GetAllSampleDtos <SampleSurrogateKey>()
                             .ToArray();

            sampleDtos.Length.Should().Be(2);

            var firstDto = sampleDtos.First(x => x.TextValue == "JJ");

            firstDto.Pk.Should().BeGreaterThan(0);
            firstDto.IntValue.Should().Be(100);
            firstDto.DecimalValue.Should().Be(100.99m);

            var secondDto = sampleDtos.First(x => x.TextValue == "BB");

            secondDto.Pk.Should().BeGreaterThan(0);
            secondDto.IntValue.Should().Be(200);
            secondDto.DecimalValue.Should().Be(200.99m);
        }