mirror of
				https://github.com/nsnail/FreeSql.git
				synced 2025-11-04 01:05:27 +08:00 
			
		
		
		
	- 修复 因兼容 #184 导致 MySql Enum 表达式解析为 int 的 bug;
- 修复 FreeSql.Provider.MySqlConnector Enum 自定义元素值,导致值计算错误的 bug;
This commit is contained in:
		@@ -160,6 +160,133 @@ namespace FreeSql.Tests.MySqlConnector
 | 
			
		||||
            g.mysql.Update<TestEnumUpdateTb>().NoneParameter().Where(a => a.id == id).Set(a => a.type, TestEnumUpdateTbType.str1).ExecuteAffrows();
 | 
			
		||||
            Assert.Equal(TestEnumUpdateTbType.str1, g.mysql.Select<TestEnumUpdateTb>().Where(a => a.id == id).First()?.type);
 | 
			
		||||
        }
 | 
			
		||||
        public class tenumcls
 | 
			
		||||
        {
 | 
			
		||||
            public Guid id { get; set; }
 | 
			
		||||
            public tenum status { get; set; }
 | 
			
		||||
        }
 | 
			
		||||
        public enum tenum
 | 
			
		||||
        {
 | 
			
		||||
            WaitPay = 1,
 | 
			
		||||
            Pay = 3,
 | 
			
		||||
            Finsh = 8,
 | 
			
		||||
            Cacel = 16,
 | 
			
		||||
            Refunding = 32
 | 
			
		||||
        }
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void SetEnum()
 | 
			
		||||
        {
 | 
			
		||||
            var fsql = g.mysql;
 | 
			
		||||
            //#184
 | 
			
		||||
            fsql.Delete<tenumcls>(Guid.Parse("5e83a910-672f-847c-00c1-316b71d153fb")).ExecuteAffrows();
 | 
			
		||||
            var item = new tenumcls { id = Guid.Parse("5e83a910-672f-847c-00c1-316b71d153fb"), status = tenum.Finsh };
 | 
			
		||||
            Assert.Equal("INSERT INTO `tenumcls`(`id`, `status`) VALUES('5e83a910-672f-847c-00c1-316b71d153fb', 'Finsh')",
 | 
			
		||||
                fsql.Insert<tenumcls>().NoneParameter().AppendData(item).ToSql());
 | 
			
		||||
            Assert.Equal(1, fsql.Insert<tenumcls>().NoneParameter().AppendData(item).ExecuteAffrows());
 | 
			
		||||
            var item2 = fsql.Select<tenumcls>().Where(a => a.id == item.id).First();
 | 
			
		||||
            Assert.Equal(item.id, item2.id);
 | 
			
		||||
            Assert.Equal(tenum.Finsh, item2.status);
 | 
			
		||||
 | 
			
		||||
            Assert.Equal(@"UPDATE `tenumcls` SET `status` = case when `id` = '5e83a910-672f-847c-00c1-316b71d153fb' then 'Pay' else 'Refunding' end 
 | 
			
		||||
WHERE (`id` = '5e83a910-672f-847c-00c1-316b71d153fb')",
 | 
			
		||||
                fsql.Update<tenumcls>(item).NoneParameter().Set(a => a.status == (a.id == item.id ? tenum.Pay : tenum.Refunding)).ToSql());
 | 
			
		||||
            Assert.Equal(1, fsql.Update<tenumcls>(item).NoneParameter().Set(a => a.status == (a.id == item.id ? tenum.Pay : tenum.Refunding)).ExecuteAffrows());
 | 
			
		||||
            item2 = fsql.Select<tenumcls>().Where(a => a.id == item.id).First();
 | 
			
		||||
            Assert.Equal(item.id, item2.id);
 | 
			
		||||
            Assert.Equal(tenum.Pay, item2.status);
 | 
			
		||||
 | 
			
		||||
            Assert.Equal(@"UPDATE `tenumcls` SET `status` = 'Finsh' 
 | 
			
		||||
WHERE (`id` = '5e83a910-672f-847c-00c1-316b71d153fb')",
 | 
			
		||||
                fsql.Update<tenumcls>(item).NoneParameter().Set(a => a.status == tenum.Finsh).ToSql());
 | 
			
		||||
            Assert.Equal(1, fsql.Update<tenumcls>(item).NoneParameter().Set(a => a.status == tenum.Finsh).ExecuteAffrows());
 | 
			
		||||
            item2 = fsql.Select<tenumcls>().Where(a => a.id == item.id).First();
 | 
			
		||||
            Assert.Equal(item.id, item2.id);
 | 
			
		||||
            Assert.Equal(tenum.Finsh, item2.status);
 | 
			
		||||
 | 
			
		||||
            Assert.Equal(@"UPDATE `tenumcls` SET `status` = 'Pay' 
 | 
			
		||||
WHERE (`id` = '5e83a910-672f-847c-00c1-316b71d153fb')",
 | 
			
		||||
    fsql.Update<tenumcls>(item).NoneParameter().Set(a => a.status == tenum.Pay).ToSql());
 | 
			
		||||
            Assert.Equal(1, fsql.Update<tenumcls>(item).NoneParameter().Set(a => a.status == tenum.Pay).ExecuteAffrows());
 | 
			
		||||
            item2 = fsql.Select<tenumcls>().Where(a => a.id == item.id).First();
 | 
			
		||||
            Assert.Equal(item.id, item2.id);
 | 
			
		||||
            Assert.Equal(tenum.Pay, item2.status);
 | 
			
		||||
 | 
			
		||||
            Assert.Equal(@"UPDATE `tenumcls` SET `status` = 'Finsh' 
 | 
			
		||||
WHERE (`id` = '5e83a910-672f-847c-00c1-316b71d153fb')",
 | 
			
		||||
                fsql.Update<tenumcls>(item).NoneParameter().Set(a => a.status, tenum.Finsh).ToSql());
 | 
			
		||||
            Assert.Equal(1, fsql.Update<tenumcls>(item).NoneParameter().Set(a => a.status, tenum.Finsh).ExecuteAffrows());
 | 
			
		||||
            item2 = fsql.Select<tenumcls>().Where(a => a.id == item.id).First();
 | 
			
		||||
            Assert.Equal(item.id, item2.id);
 | 
			
		||||
            Assert.Equal(tenum.Finsh, item2.status);
 | 
			
		||||
 | 
			
		||||
            Assert.Equal(@"UPDATE `tenumcls` SET `status` = 'Pay' 
 | 
			
		||||
WHERE (`id` = '5e83a910-672f-847c-00c1-316b71d153fb')",
 | 
			
		||||
    fsql.Update<tenumcls>(item).NoneParameter().Set(a => a.status, tenum.Pay).ToSql());
 | 
			
		||||
            Assert.Equal(1, fsql.Update<tenumcls>(item).NoneParameter().Set(a => a.status, tenum.Pay).ExecuteAffrows());
 | 
			
		||||
 | 
			
		||||
            Assert.Equal(@"SELECT a.`id`, a.`status` 
 | 
			
		||||
FROM `tenumcls` a 
 | 
			
		||||
WHERE (a.`id` = '5e83a910-672f-847c-00c1-316b71d153fb' AND a.`status` = case when a.`id` = '5e83a910-672f-847c-00c1-316b71d153fb' then 'Pay' else 'Refunding' end) 
 | 
			
		||||
limit 0,1", fsql.Select<tenumcls>().Where(a => a.id == item.id && a.status == (a.id == item.id ? tenum.Pay : tenum.Refunding)).Limit(1).ToSql());
 | 
			
		||||
            item2 = fsql.Select<tenumcls>().Where(a => a.id == item.id && a.status == (a.id == item.id ? tenum.Pay : tenum.Refunding)).First();
 | 
			
		||||
            Assert.Equal(item.id, item2.id);
 | 
			
		||||
            Assert.Equal(tenum.Pay, item2.status);
 | 
			
		||||
 | 
			
		||||
            //Parameter
 | 
			
		||||
            fsql.Delete<tenumcls>(Guid.Parse("5e83a910-672f-847c-00c1-316b71d153fb")).ExecuteAffrows();
 | 
			
		||||
            item = new tenumcls { id = Guid.Parse("5e83a910-672f-847c-00c1-316b71d153fb"), status = tenum.Finsh };
 | 
			
		||||
            Assert.Equal("INSERT INTO `tenumcls`(`id`, `status`) VALUES(@id_0, @status_0)",
 | 
			
		||||
                fsql.Insert<tenumcls>().AppendData(item).ToSql());
 | 
			
		||||
            Assert.Equal(1, fsql.Insert<tenumcls>().AppendData(item).ExecuteAffrows());
 | 
			
		||||
            item2 = fsql.Select<tenumcls>().Where(a => a.id == item.id).First();
 | 
			
		||||
            Assert.Equal(item.id, item2.id);
 | 
			
		||||
            Assert.Equal(tenum.Finsh, item2.status);
 | 
			
		||||
 | 
			
		||||
            Assert.Equal(@"UPDATE `tenumcls` SET `status` = case when `id` = '5e83a910-672f-847c-00c1-316b71d153fb' then 'Pay' else 'Refunding' end 
 | 
			
		||||
WHERE (`id` = '5e83a910-672f-847c-00c1-316b71d153fb')",
 | 
			
		||||
                fsql.Update<tenumcls>(item).Set(a => a.status == (a.id == item.id ? tenum.Pay : tenum.Refunding)).ToSql());
 | 
			
		||||
            Assert.Equal(1, fsql.Update<tenumcls>(item).Set(a => a.status == (a.id == item.id ? tenum.Pay : tenum.Refunding)).ExecuteAffrows());
 | 
			
		||||
            item2 = fsql.Select<tenumcls>().Where(a => a.id == item.id).First();
 | 
			
		||||
            Assert.Equal(item.id, item2.id);
 | 
			
		||||
            Assert.Equal(tenum.Pay, item2.status);
 | 
			
		||||
 | 
			
		||||
            Assert.Equal(@"UPDATE `tenumcls` SET `status` = 'Finsh' 
 | 
			
		||||
WHERE (`id` = '5e83a910-672f-847c-00c1-316b71d153fb')",
 | 
			
		||||
                fsql.Update<tenumcls>(item).Set(a => a.status == tenum.Finsh).ToSql());
 | 
			
		||||
            Assert.Equal(1, fsql.Update<tenumcls>(item).Set(a => a.status == tenum.Finsh).ExecuteAffrows());
 | 
			
		||||
            item2 = fsql.Select<tenumcls>().Where(a => a.id == item.id).First();
 | 
			
		||||
            Assert.Equal(item.id, item2.id);
 | 
			
		||||
            Assert.Equal(tenum.Finsh, item2.status);
 | 
			
		||||
 | 
			
		||||
            Assert.Equal(@"UPDATE `tenumcls` SET `status` = 'Pay' 
 | 
			
		||||
WHERE (`id` = '5e83a910-672f-847c-00c1-316b71d153fb')",
 | 
			
		||||
    fsql.Update<tenumcls>(item).Set(a => a.status == tenum.Pay).ToSql());
 | 
			
		||||
            Assert.Equal(1, fsql.Update<tenumcls>(item).Set(a => a.status == tenum.Pay).ExecuteAffrows());
 | 
			
		||||
            item2 = fsql.Select<tenumcls>().Where(a => a.id == item.id).First();
 | 
			
		||||
            Assert.Equal(item.id, item2.id);
 | 
			
		||||
            Assert.Equal(tenum.Pay, item2.status);
 | 
			
		||||
 | 
			
		||||
            Assert.Equal(@"UPDATE `tenumcls` SET `status` = @p_0 
 | 
			
		||||
WHERE (`id` = '5e83a910-672f-847c-00c1-316b71d153fb')",
 | 
			
		||||
                fsql.Update<tenumcls>(item).Set(a => a.status, tenum.Finsh).ToSql());
 | 
			
		||||
            Assert.Equal(1, fsql.Update<tenumcls>(item).Set(a => a.status, tenum.Finsh).ExecuteAffrows());
 | 
			
		||||
            item2 = fsql.Select<tenumcls>().Where(a => a.id == item.id).First();
 | 
			
		||||
            Assert.Equal(item.id, item2.id);
 | 
			
		||||
            Assert.Equal(tenum.Finsh, item2.status);
 | 
			
		||||
 | 
			
		||||
            Assert.Equal(@"UPDATE `tenumcls` SET `status` = @p_0 
 | 
			
		||||
WHERE (`id` = '5e83a910-672f-847c-00c1-316b71d153fb')",
 | 
			
		||||
    fsql.Update<tenumcls>(item).Set(a => a.status, tenum.Pay).ToSql());
 | 
			
		||||
            Assert.Equal(1, fsql.Update<tenumcls>(item).Set(a => a.status, tenum.Pay).ExecuteAffrows());
 | 
			
		||||
 | 
			
		||||
            Assert.Equal(@"SELECT a.`id`, a.`status` 
 | 
			
		||||
FROM `tenumcls` a 
 | 
			
		||||
WHERE (a.`id` = '5e83a910-672f-847c-00c1-316b71d153fb' AND a.`status` = case when a.`id` = '5e83a910-672f-847c-00c1-316b71d153fb' then 'Pay' else 'Refunding' end) 
 | 
			
		||||
limit 0,1", fsql.Select<tenumcls>().Where(a => a.id == item.id && a.status == (a.id == item.id ? tenum.Pay : tenum.Refunding)).Limit(1).ToSql());
 | 
			
		||||
            item2 = fsql.Select<tenumcls>().Where(a => a.id == item.id && a.status == (a.id == item.id ? tenum.Pay : tenum.Refunding)).First();
 | 
			
		||||
            Assert.Equal(item.id, item2.id);
 | 
			
		||||
            Assert.Equal(tenum.Pay, item2.status);
 | 
			
		||||
        }
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void SetRaw()
 | 
			
		||||
        {
 | 
			
		||||
 
 | 
			
		||||
@@ -160,6 +160,78 @@ namespace FreeSql.Tests.Odbc.MySql
 | 
			
		||||
            g.mysql.Update<TestEnumUpdateTb>().NoneParameter().Where(a => a.id == id).Set(a => a.type, TestEnumUpdateTbType.str1).ExecuteAffrows();
 | 
			
		||||
            Assert.Equal(TestEnumUpdateTbType.str1, g.mysql.Select<TestEnumUpdateTb>().Where(a => a.id == id).First()?.type);
 | 
			
		||||
        }
 | 
			
		||||
        public class tenumcls
 | 
			
		||||
        {
 | 
			
		||||
            public Guid id { get; set; }
 | 
			
		||||
            public tenum status { get; set; }
 | 
			
		||||
        }
 | 
			
		||||
        public enum tenum
 | 
			
		||||
        {
 | 
			
		||||
            WaitPay = 1,
 | 
			
		||||
            Pay = 3,
 | 
			
		||||
            Finsh = 8,
 | 
			
		||||
            Cacel = 16,
 | 
			
		||||
            Refunding = 32
 | 
			
		||||
        }
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void SetEnum()
 | 
			
		||||
        {
 | 
			
		||||
            var fsql = g.mysql;
 | 
			
		||||
            //#184
 | 
			
		||||
            fsql.Delete<tenumcls>(Guid.Parse("5e83a910-672f-847c-00c1-316b71d153fb")).ExecuteAffrows();
 | 
			
		||||
            var item = new tenumcls { id = Guid.Parse("5e83a910-672f-847c-00c1-316b71d153fb"), status = tenum.Finsh };
 | 
			
		||||
            Assert.Equal("INSERT INTO `tenumcls`(`id`, `status`) VALUES('5e83a910-672f-847c-00c1-316b71d153fb', 'Finsh')",
 | 
			
		||||
                fsql.Insert<tenumcls>().NoneParameter().AppendData(item).ToSql());
 | 
			
		||||
            Assert.Equal(1, fsql.Insert<tenumcls>().NoneParameter().AppendData(item).ExecuteAffrows());
 | 
			
		||||
            var item2 = fsql.Select<tenumcls>().Where(a => a.id == item.id).First();
 | 
			
		||||
            Assert.Equal(item.id, item2.id);
 | 
			
		||||
            Assert.Equal(tenum.Finsh, item2.status);
 | 
			
		||||
 | 
			
		||||
            Assert.Equal(@"UPDATE `tenumcls` SET `status` = case when `id` = '5e83a910-672f-847c-00c1-316b71d153fb' then 'Pay' else 'Refunding' end 
 | 
			
		||||
WHERE (`id` = '5e83a910-672f-847c-00c1-316b71d153fb')",
 | 
			
		||||
                fsql.Update<tenumcls>(item).NoneParameter().Set(a => a.status == (a.id == item.id ? tenum.Pay : tenum.Refunding)).ToSql());
 | 
			
		||||
            Assert.Equal(1, fsql.Update<tenumcls>(item).NoneParameter().Set(a => a.status == (a.id == item.id ? tenum.Pay : tenum.Refunding)).ExecuteAffrows());
 | 
			
		||||
            item2 = fsql.Select<tenumcls>().Where(a => a.id == item.id).First();
 | 
			
		||||
            Assert.Equal(item.id, item2.id);
 | 
			
		||||
            Assert.Equal(tenum.Pay, item2.status);
 | 
			
		||||
 | 
			
		||||
            Assert.Equal(@"UPDATE `tenumcls` SET `status` = 'Finsh' 
 | 
			
		||||
WHERE (`id` = '5e83a910-672f-847c-00c1-316b71d153fb')",
 | 
			
		||||
                fsql.Update<tenumcls>(item).NoneParameter().Set(a => a.status == tenum.Finsh).ToSql());
 | 
			
		||||
            Assert.Equal(1, fsql.Update<tenumcls>(item).NoneParameter().Set(a => a.status == tenum.Finsh).ExecuteAffrows());
 | 
			
		||||
            item2 = fsql.Select<tenumcls>().Where(a => a.id == item.id).First();
 | 
			
		||||
            Assert.Equal(item.id, item2.id);
 | 
			
		||||
            Assert.Equal(tenum.Finsh, item2.status);
 | 
			
		||||
 | 
			
		||||
            Assert.Equal(@"UPDATE `tenumcls` SET `status` = 'Pay' 
 | 
			
		||||
WHERE (`id` = '5e83a910-672f-847c-00c1-316b71d153fb')",
 | 
			
		||||
    fsql.Update<tenumcls>(item).NoneParameter().Set(a => a.status == tenum.Pay).ToSql());
 | 
			
		||||
            Assert.Equal(1, fsql.Update<tenumcls>(item).NoneParameter().Set(a => a.status == tenum.Pay).ExecuteAffrows());
 | 
			
		||||
            item2 = fsql.Select<tenumcls>().Where(a => a.id == item.id).First();
 | 
			
		||||
            Assert.Equal(item.id, item2.id);
 | 
			
		||||
            Assert.Equal(tenum.Pay, item2.status);
 | 
			
		||||
 | 
			
		||||
            Assert.Equal(@"UPDATE `tenumcls` SET `status` = 'Finsh' 
 | 
			
		||||
WHERE (`id` = '5e83a910-672f-847c-00c1-316b71d153fb')",
 | 
			
		||||
                fsql.Update<tenumcls>(item).NoneParameter().Set(a => a.status, tenum.Finsh).ToSql());
 | 
			
		||||
            Assert.Equal(1, fsql.Update<tenumcls>(item).NoneParameter().Set(a => a.status, tenum.Finsh).ExecuteAffrows());
 | 
			
		||||
            item2 = fsql.Select<tenumcls>().Where(a => a.id == item.id).First();
 | 
			
		||||
            Assert.Equal(item.id, item2.id);
 | 
			
		||||
            Assert.Equal(tenum.Finsh, item2.status);
 | 
			
		||||
 | 
			
		||||
            Assert.Equal(@"UPDATE `tenumcls` SET `status` = 'Pay' 
 | 
			
		||||
WHERE (`id` = '5e83a910-672f-847c-00c1-316b71d153fb')",
 | 
			
		||||
    fsql.Update<tenumcls>(item).NoneParameter().Set(a => a.status, tenum.Pay).ToSql());
 | 
			
		||||
            Assert.Equal(1, fsql.Update<tenumcls>(item).NoneParameter().Set(a => a.status, tenum.Pay).ExecuteAffrows());
 | 
			
		||||
 | 
			
		||||
            Assert.Equal(@"SELECT a.`id`, a.`status` 
 | 
			
		||||
FROM `tenumcls` a 
 | 
			
		||||
WHERE (a.`id` = '5e83a910-672f-847c-00c1-316b71d153fb' AND a.`status` = case when a.`id` = '5e83a910-672f-847c-00c1-316b71d153fb' then 'Pay' else 'Refunding' end) 
 | 
			
		||||
limit 0,1", fsql.Select<tenumcls>().Where(a => a.id == item.id && a.status == (a.id == item.id ? tenum.Pay : tenum.Refunding)).Limit(1).ToSql());
 | 
			
		||||
            item2 = fsql.Select<tenumcls>().Where(a => a.id == item.id && a.status == (a.id == item.id ? tenum.Pay : tenum.Refunding)).First();
 | 
			
		||||
            Assert.Equal(item.id, item2.id);
 | 
			
		||||
            Assert.Equal(tenum.Pay, item2.status);
 | 
			
		||||
        }
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void SetRaw()
 | 
			
		||||
        {
 | 
			
		||||
 
 | 
			
		||||
@@ -161,6 +161,134 @@ namespace FreeSql.Tests.MySql
 | 
			
		||||
            g.mysql.Update<TestEnumUpdateTb>().NoneParameter().Where(a => a.id == id).Set(a => a.type, TestEnumUpdateTbType.str1).ExecuteAffrows();
 | 
			
		||||
            Assert.Equal(TestEnumUpdateTbType.str1, g.mysql.Select<TestEnumUpdateTb>().Where(a => a.id == id).First()?.type);
 | 
			
		||||
        }
 | 
			
		||||
        public class tenumcls
 | 
			
		||||
        {
 | 
			
		||||
            public Guid id { get; set; }
 | 
			
		||||
            public tenum status { get; set; }
 | 
			
		||||
        }
 | 
			
		||||
        public enum tenum
 | 
			
		||||
        {
 | 
			
		||||
            WaitPay = 1,
 | 
			
		||||
            Pay = 3,
 | 
			
		||||
            Finsh = 8,
 | 
			
		||||
            Cacel = 16,
 | 
			
		||||
            Refunding = 32
 | 
			
		||||
        }
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void SetEnum()
 | 
			
		||||
        {
 | 
			
		||||
            var fsql = g.mysql;
 | 
			
		||||
            //#184
 | 
			
		||||
            fsql.Delete<tenumcls>(Guid.Parse("5e83a910-672f-847c-00c1-316b71d153fb")).ExecuteAffrows();
 | 
			
		||||
            var item = new tenumcls { id = Guid.Parse("5e83a910-672f-847c-00c1-316b71d153fb"), status = tenum.Finsh };
 | 
			
		||||
            Assert.Equal("INSERT INTO `tenumcls`(`id`, `status`) VALUES('5e83a910-672f-847c-00c1-316b71d153fb', 'Finsh')",
 | 
			
		||||
                fsql.Insert<tenumcls>().NoneParameter().AppendData(item).ToSql());
 | 
			
		||||
            Assert.Equal(1, fsql.Insert<tenumcls>().NoneParameter().AppendData(item).ExecuteAffrows());
 | 
			
		||||
            var item2 = fsql.Select<tenumcls>().Where(a => a.id == item.id).First();
 | 
			
		||||
            Assert.Equal(item.id, item2.id);
 | 
			
		||||
            Assert.Equal(tenum.Finsh, item2.status);
 | 
			
		||||
 | 
			
		||||
            Assert.Equal(@"UPDATE `tenumcls` SET `status` = case when `id` = '5e83a910-672f-847c-00c1-316b71d153fb' then 'Pay' else 'Refunding' end 
 | 
			
		||||
WHERE (`id` = '5e83a910-672f-847c-00c1-316b71d153fb')",
 | 
			
		||||
                fsql.Update<tenumcls>(item).NoneParameter().Set(a => a.status == (a.id == item.id ? tenum.Pay : tenum.Refunding)).ToSql());
 | 
			
		||||
            Assert.Equal(1, fsql.Update<tenumcls>(item).NoneParameter().Set(a => a.status == (a.id == item.id ? tenum.Pay : tenum.Refunding)).ExecuteAffrows());
 | 
			
		||||
            item2 = fsql.Select<tenumcls>().Where(a => a.id == item.id).First();
 | 
			
		||||
            Assert.Equal(item.id, item2.id);
 | 
			
		||||
            Assert.Equal(tenum.Pay, item2.status);
 | 
			
		||||
 | 
			
		||||
            Assert.Equal(@"UPDATE `tenumcls` SET `status` = 'Finsh' 
 | 
			
		||||
WHERE (`id` = '5e83a910-672f-847c-00c1-316b71d153fb')",
 | 
			
		||||
                fsql.Update<tenumcls>(item).NoneParameter().Set(a => a.status == tenum.Finsh).ToSql());
 | 
			
		||||
            Assert.Equal(1, fsql.Update<tenumcls>(item).NoneParameter().Set(a => a.status == tenum.Finsh).ExecuteAffrows());
 | 
			
		||||
            item2 = fsql.Select<tenumcls>().Where(a => a.id == item.id).First();
 | 
			
		||||
            Assert.Equal(item.id, item2.id);
 | 
			
		||||
            Assert.Equal(tenum.Finsh, item2.status);
 | 
			
		||||
 | 
			
		||||
            Assert.Equal(@"UPDATE `tenumcls` SET `status` = 'Pay' 
 | 
			
		||||
WHERE (`id` = '5e83a910-672f-847c-00c1-316b71d153fb')",
 | 
			
		||||
    fsql.Update<tenumcls>(item).NoneParameter().Set(a => a.status == tenum.Pay).ToSql());
 | 
			
		||||
            Assert.Equal(1, fsql.Update<tenumcls>(item).NoneParameter().Set(a => a.status == tenum.Pay).ExecuteAffrows());
 | 
			
		||||
            item2 = fsql.Select<tenumcls>().Where(a => a.id == item.id).First();
 | 
			
		||||
            Assert.Equal(item.id, item2.id);
 | 
			
		||||
            Assert.Equal(tenum.Pay, item2.status);
 | 
			
		||||
 | 
			
		||||
            Assert.Equal(@"UPDATE `tenumcls` SET `status` = 'Finsh' 
 | 
			
		||||
WHERE (`id` = '5e83a910-672f-847c-00c1-316b71d153fb')",
 | 
			
		||||
                fsql.Update<tenumcls>(item).NoneParameter().Set(a => a.status, tenum.Finsh).ToSql());
 | 
			
		||||
            Assert.Equal(1, fsql.Update<tenumcls>(item).NoneParameter().Set(a => a.status, tenum.Finsh).ExecuteAffrows());
 | 
			
		||||
            item2 = fsql.Select<tenumcls>().Where(a => a.id == item.id).First();
 | 
			
		||||
            Assert.Equal(item.id, item2.id);
 | 
			
		||||
            Assert.Equal(tenum.Finsh, item2.status);
 | 
			
		||||
 | 
			
		||||
            Assert.Equal(@"UPDATE `tenumcls` SET `status` = 'Pay' 
 | 
			
		||||
WHERE (`id` = '5e83a910-672f-847c-00c1-316b71d153fb')",
 | 
			
		||||
    fsql.Update<tenumcls>(item).NoneParameter().Set(a => a.status, tenum.Pay).ToSql());
 | 
			
		||||
            Assert.Equal(1, fsql.Update<tenumcls>(item).NoneParameter().Set(a => a.status, tenum.Pay).ExecuteAffrows());
 | 
			
		||||
 | 
			
		||||
            Assert.Equal(@"SELECT a.`id`, a.`status` 
 | 
			
		||||
FROM `tenumcls` a 
 | 
			
		||||
WHERE (a.`id` = '5e83a910-672f-847c-00c1-316b71d153fb' AND a.`status` = case when a.`id` = '5e83a910-672f-847c-00c1-316b71d153fb' then 'Pay' else 'Refunding' end) 
 | 
			
		||||
limit 0,1", fsql.Select<tenumcls>().Where(a => a.id == item.id && a.status == (a.id == item.id ? tenum.Pay : tenum.Refunding)).Limit(1).ToSql());
 | 
			
		||||
            item2 = fsql.Select<tenumcls>().Where(a => a.id == item.id && a.status == (a.id == item.id ? tenum.Pay : tenum.Refunding)).First();
 | 
			
		||||
            Assert.Equal(item.id, item2.id);
 | 
			
		||||
            Assert.Equal(tenum.Pay, item2.status);
 | 
			
		||||
 | 
			
		||||
            //Parameter
 | 
			
		||||
            fsql.Delete<tenumcls>(Guid.Parse("5e83a910-672f-847c-00c1-316b71d153fb")).ExecuteAffrows();
 | 
			
		||||
            item = new tenumcls { id = Guid.Parse("5e83a910-672f-847c-00c1-316b71d153fb"), status = tenum.Finsh };
 | 
			
		||||
            Assert.Equal("INSERT INTO `tenumcls`(`id`, `status`) VALUES(?id_0, ?status_0)",
 | 
			
		||||
                fsql.Insert<tenumcls>().AppendData(item).ToSql());
 | 
			
		||||
            Assert.Equal(1, fsql.Insert<tenumcls>().AppendData(item).ExecuteAffrows());
 | 
			
		||||
            item2 = fsql.Select<tenumcls>().Where(a => a.id == item.id).First();
 | 
			
		||||
            Assert.Equal(item.id, item2.id);
 | 
			
		||||
            Assert.Equal(tenum.Finsh, item2.status);
 | 
			
		||||
 | 
			
		||||
            Assert.Equal(@"UPDATE `tenumcls` SET `status` = case when `id` = '5e83a910-672f-847c-00c1-316b71d153fb' then 'Pay' else 'Refunding' end 
 | 
			
		||||
WHERE (`id` = '5e83a910-672f-847c-00c1-316b71d153fb')",
 | 
			
		||||
                fsql.Update<tenumcls>(item).Set(a => a.status == (a.id == item.id ? tenum.Pay : tenum.Refunding)).ToSql());
 | 
			
		||||
            Assert.Equal(1, fsql.Update<tenumcls>(item).Set(a => a.status == (a.id == item.id ? tenum.Pay : tenum.Refunding)).ExecuteAffrows());
 | 
			
		||||
            item2 = fsql.Select<tenumcls>().Where(a => a.id == item.id).First();
 | 
			
		||||
            Assert.Equal(item.id, item2.id);
 | 
			
		||||
            Assert.Equal(tenum.Pay, item2.status);
 | 
			
		||||
 | 
			
		||||
            Assert.Equal(@"UPDATE `tenumcls` SET `status` = 'Finsh' 
 | 
			
		||||
WHERE (`id` = '5e83a910-672f-847c-00c1-316b71d153fb')",
 | 
			
		||||
                fsql.Update<tenumcls>(item).Set(a => a.status == tenum.Finsh).ToSql());
 | 
			
		||||
            Assert.Equal(1, fsql.Update<tenumcls>(item).Set(a => a.status == tenum.Finsh).ExecuteAffrows());
 | 
			
		||||
            item2 = fsql.Select<tenumcls>().Where(a => a.id == item.id).First();
 | 
			
		||||
            Assert.Equal(item.id, item2.id);
 | 
			
		||||
            Assert.Equal(tenum.Finsh, item2.status);
 | 
			
		||||
 | 
			
		||||
            Assert.Equal(@"UPDATE `tenumcls` SET `status` = 'Pay' 
 | 
			
		||||
WHERE (`id` = '5e83a910-672f-847c-00c1-316b71d153fb')",
 | 
			
		||||
    fsql.Update<tenumcls>(item).Set(a => a.status == tenum.Pay).ToSql());
 | 
			
		||||
            Assert.Equal(1, fsql.Update<tenumcls>(item).Set(a => a.status == tenum.Pay).ExecuteAffrows());
 | 
			
		||||
            item2 = fsql.Select<tenumcls>().Where(a => a.id == item.id).First();
 | 
			
		||||
            Assert.Equal(item.id, item2.id);
 | 
			
		||||
            Assert.Equal(tenum.Pay, item2.status);
 | 
			
		||||
 | 
			
		||||
            Assert.Equal(@"UPDATE `tenumcls` SET `status` = ?p_0 
 | 
			
		||||
WHERE (`id` = '5e83a910-672f-847c-00c1-316b71d153fb')",
 | 
			
		||||
                fsql.Update<tenumcls>(item).Set(a => a.status, tenum.Finsh).ToSql());
 | 
			
		||||
            Assert.Equal(1, fsql.Update<tenumcls>(item).Set(a => a.status, tenum.Finsh).ExecuteAffrows());
 | 
			
		||||
            item2 = fsql.Select<tenumcls>().Where(a => a.id == item.id).First();
 | 
			
		||||
            Assert.Equal(item.id, item2.id);
 | 
			
		||||
            Assert.Equal(tenum.Finsh, item2.status);
 | 
			
		||||
 | 
			
		||||
            Assert.Equal(@"UPDATE `tenumcls` SET `status` = ?p_0 
 | 
			
		||||
WHERE (`id` = '5e83a910-672f-847c-00c1-316b71d153fb')",
 | 
			
		||||
    fsql.Update<tenumcls>(item).Set(a => a.status, tenum.Pay).ToSql());
 | 
			
		||||
            Assert.Equal(1, fsql.Update<tenumcls>(item).Set(a => a.status, tenum.Pay).ExecuteAffrows());
 | 
			
		||||
 | 
			
		||||
            Assert.Equal(@"SELECT a.`id`, a.`status` 
 | 
			
		||||
FROM `tenumcls` a 
 | 
			
		||||
WHERE (a.`id` = '5e83a910-672f-847c-00c1-316b71d153fb' AND a.`status` = case when a.`id` = '5e83a910-672f-847c-00c1-316b71d153fb' then 'Pay' else 'Refunding' end) 
 | 
			
		||||
limit 0,1", fsql.Select<tenumcls>().Where(a => a.id == item.id && a.status == (a.id == item.id ? tenum.Pay : tenum.Refunding)).Limit(1).ToSql());
 | 
			
		||||
            item2 = fsql.Select<tenumcls>().Where(a => a.id == item.id && a.status == (a.id == item.id ? tenum.Pay : tenum.Refunding)).First();
 | 
			
		||||
            Assert.Equal(item.id, item2.id);
 | 
			
		||||
            Assert.Equal(tenum.Pay, item2.status);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void SetRaw()
 | 
			
		||||
        {
 | 
			
		||||
 
 | 
			
		||||
@@ -489,7 +489,9 @@ namespace FreeSql.Internal
 | 
			
		||||
            var right = ExpressionLambdaToSql(rightExp, tsc);
 | 
			
		||||
            if (right != "NULL" && isLeftMapType && 
 | 
			
		||||
                //判断参数化后的bug
 | 
			
		||||
                !(right.Contains('@') || right.Contains('?') || right.Contains(':')))
 | 
			
		||||
                !(right.Contains('@') || right.Contains('?') || right.Contains(':')) &&
 | 
			
		||||
                //三元表达式后,取消此条件 #184
 | 
			
		||||
                tsc.mapType != null)
 | 
			
		||||
            {
 | 
			
		||||
                var enumType = leftMapColumn.CsType.NullableTypeOrThis();
 | 
			
		||||
                if (enumType.IsEnum)
 | 
			
		||||
@@ -505,7 +507,9 @@ namespace FreeSql.Internal
 | 
			
		||||
                    left = ExpressionLambdaToSql(leftExp, tsc);
 | 
			
		||||
                    if (left != "NULL" && isRightMapType &&
 | 
			
		||||
                        //判断参数化后的bug
 | 
			
		||||
                        !(left.Contains('@') || left.Contains('?') || left.Contains(':')))
 | 
			
		||||
                        !(left.Contains('@') || left.Contains('?') || left.Contains(':')) &&
 | 
			
		||||
                        //三元表达式后,取消此条件 #184
 | 
			
		||||
                        tsc.mapType != null)
 | 
			
		||||
                    {
 | 
			
		||||
                        var enumType = rightMapColumn.CsType.NullableTypeOrThis();
 | 
			
		||||
                        if (enumType.IsEnum)
 | 
			
		||||
@@ -598,7 +602,12 @@ namespace FreeSql.Internal
 | 
			
		||||
                case ExpressionType.Constant: return formatSql((exp as ConstantExpression)?.Value, tsc.mapType, tsc.mapColumnTmp, null);
 | 
			
		||||
                case ExpressionType.Conditional:
 | 
			
		||||
                    var condExp = exp as ConditionalExpression;
 | 
			
		||||
                    return _common.IIF(ExpressionLambdaToSql(condExp.Test, tsc), ExpressionLambdaToSql(condExp.IfTrue, tsc), ExpressionLambdaToSql(condExp.IfFalse, tsc));
 | 
			
		||||
                    var conditionalTestOldMapType = tsc.SetMapTypeReturnOld(null);
 | 
			
		||||
                    var conditionalTestSql = ExpressionLambdaToSql(condExp.Test, tsc);
 | 
			
		||||
                    tsc.SetMapTypeReturnOld(conditionalTestOldMapType);
 | 
			
		||||
                    var conditionalSql = _common.IIF(conditionalTestSql, ExpressionLambdaToSql(condExp.IfTrue, tsc), ExpressionLambdaToSql(condExp.IfFalse, tsc));
 | 
			
		||||
                    tsc.SetMapTypeReturnOld(null);
 | 
			
		||||
                    return conditionalSql;
 | 
			
		||||
                case ExpressionType.Call:
 | 
			
		||||
                    tsc.mapType = null;
 | 
			
		||||
                    var exp3 = exp as MethodCallExpression;
 | 
			
		||||
 
 | 
			
		||||
@@ -406,8 +406,7 @@ namespace FreeSql.Internal.CommonProvider
 | 
			
		||||
            {
 | 
			
		||||
                case ExpressionType.Equal:
 | 
			
		||||
                    var equalBinaryExp = body as BinaryExpression;
 | 
			
		||||
                    _set.Append(", ").Append(_commonExpression.ExpressionWhereLambdaNoneForeignObject(null, _table, null, equalBinaryExp.Left, null, null))
 | 
			
		||||
                        .Append(" = ").Append(_commonExpression.ExpressionWhereLambdaNoneForeignObject(null, _table, null, equalBinaryExp.Right, null, null));
 | 
			
		||||
                    _set.Append(", ").Append(_commonExpression.ExpressionWhereLambdaNoneForeignObject(null, _table, null, body, null, null));
 | 
			
		||||
                    return this;
 | 
			
		||||
                case ExpressionType.MemberInit:
 | 
			
		||||
                    var initExp = body as MemberInitExpression;
 | 
			
		||||
 
 | 
			
		||||
@@ -3,6 +3,7 @@ using FreeSql.Internal.Model;
 | 
			
		||||
using MySql.Data.MySqlClient;
 | 
			
		||||
using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.Collections.Concurrent;
 | 
			
		||||
using System.Data.Common;
 | 
			
		||||
 | 
			
		||||
namespace FreeSql.MySql
 | 
			
		||||
@@ -44,12 +45,11 @@ namespace FreeSql.MySql
 | 
			
		||||
            {
 | 
			
		||||
                ret.MySqlDbType = dbtype;
 | 
			
		||||
                if (ret.MySqlDbType == MySqlDbType.Enum && value != null)
 | 
			
		||||
                    ret.Value = (long)Convert.ChangeType(value, typeof(long)) + 1;
 | 
			
		||||
                    ret.Value = EnumValueToMySql(col, value);
 | 
			
		||||
            }
 | 
			
		||||
            _params?.Add(ret);
 | 
			
		||||
            return ret;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public override DbParameter[] GetDbParamtersByObject(string sql, object obj) =>
 | 
			
		||||
            Utils.GetDbParamtersByObject<MySqlParameter>(sql, obj, "@", (name, type, value) =>
 | 
			
		||||
            {
 | 
			
		||||
@@ -66,12 +66,27 @@ namespace FreeSql.MySql
 | 
			
		||||
                    {
 | 
			
		||||
                        ret.MySqlDbType = (MySqlDbType)tp.Value;
 | 
			
		||||
                        if (ret.MySqlDbType == MySqlDbType.Enum && value != null)
 | 
			
		||||
                            ret.Value = (long)Convert.ChangeType(value, typeof(long)) + 1;
 | 
			
		||||
                            ret.Value = EnumValueToMySql(null, value);
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                return ret;
 | 
			
		||||
            });
 | 
			
		||||
 | 
			
		||||
        static ConcurrentDictionary<Type, Dictionary<string, int>> _dicEnumNames = new ConcurrentDictionary<Type, Dictionary<string, int>>();
 | 
			
		||||
        static long EnumValueToMySql(ColumnInfo col, object value) //mysqlConnector 不支持 enumString 作为参数化传递,所以要计算出下标值,mysql 下标从 1 开始,并且 c# 设置了枚举元素值会影响下标
 | 
			
		||||
        {
 | 
			
		||||
            if (value == null) return 0;
 | 
			
		||||
            if (value is Enum == false) return 0;
 | 
			
		||||
            var names = _dicEnumNames.GetOrAdd(col?.Attribute.MapType ?? value.GetType(), type =>
 | 
			
		||||
            {
 | 
			
		||||
                var dic = new Dictionary<string, int>();
 | 
			
		||||
                var ns = Enum.GetNames(type);
 | 
			
		||||
                for (var a = 0; a < ns.Length; a++) dic.Add(ns[a], a + 1);
 | 
			
		||||
                return dic;
 | 
			
		||||
            });
 | 
			
		||||
            return names.TryGetValue(value.ToString(), out var tryval) ? tryval : 0;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public override string FormatSql(string sql, params object[] args) => sql?.FormatMySql(args);
 | 
			
		||||
        public override string QuoteSqlName(params string[] name)
 | 
			
		||||
        {
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user