diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/MySqlConnector/Curd/MySqlUpdateTest.cs b/FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/MySqlConnector/Curd/MySqlUpdateTest.cs index 34f0a3c8..441fdfd5 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/MySqlConnector/Curd/MySqlUpdateTest.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/MySqlConnector/Curd/MySqlUpdateTest.cs @@ -160,6 +160,133 @@ namespace FreeSql.Tests.MySqlConnector g.mysql.Update().NoneParameter().Where(a => a.id == id).Set(a => a.type, TestEnumUpdateTbType.str1).ExecuteAffrows(); Assert.Equal(TestEnumUpdateTbType.str1, g.mysql.Select().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(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().NoneParameter().AppendData(item).ToSql()); + Assert.Equal(1, fsql.Insert().NoneParameter().AppendData(item).ExecuteAffrows()); + var item2 = fsql.Select().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(item).NoneParameter().Set(a => a.status == (a.id == item.id ? tenum.Pay : tenum.Refunding)).ToSql()); + Assert.Equal(1, fsql.Update(item).NoneParameter().Set(a => a.status == (a.id == item.id ? tenum.Pay : tenum.Refunding)).ExecuteAffrows()); + item2 = fsql.Select().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(item).NoneParameter().Set(a => a.status == tenum.Finsh).ToSql()); + Assert.Equal(1, fsql.Update(item).NoneParameter().Set(a => a.status == tenum.Finsh).ExecuteAffrows()); + item2 = fsql.Select().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(item).NoneParameter().Set(a => a.status == tenum.Pay).ToSql()); + Assert.Equal(1, fsql.Update(item).NoneParameter().Set(a => a.status == tenum.Pay).ExecuteAffrows()); + item2 = fsql.Select().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(item).NoneParameter().Set(a => a.status, tenum.Finsh).ToSql()); + Assert.Equal(1, fsql.Update(item).NoneParameter().Set(a => a.status, tenum.Finsh).ExecuteAffrows()); + item2 = fsql.Select().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(item).NoneParameter().Set(a => a.status, tenum.Pay).ToSql()); + Assert.Equal(1, fsql.Update(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().Where(a => a.id == item.id && a.status == (a.id == item.id ? tenum.Pay : tenum.Refunding)).Limit(1).ToSql()); + item2 = fsql.Select().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(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().AppendData(item).ToSql()); + Assert.Equal(1, fsql.Insert().AppendData(item).ExecuteAffrows()); + item2 = fsql.Select().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(item).Set(a => a.status == (a.id == item.id ? tenum.Pay : tenum.Refunding)).ToSql()); + Assert.Equal(1, fsql.Update(item).Set(a => a.status == (a.id == item.id ? tenum.Pay : tenum.Refunding)).ExecuteAffrows()); + item2 = fsql.Select().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(item).Set(a => a.status == tenum.Finsh).ToSql()); + Assert.Equal(1, fsql.Update(item).Set(a => a.status == tenum.Finsh).ExecuteAffrows()); + item2 = fsql.Select().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(item).Set(a => a.status == tenum.Pay).ToSql()); + Assert.Equal(1, fsql.Update(item).Set(a => a.status == tenum.Pay).ExecuteAffrows()); + item2 = fsql.Select().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(item).Set(a => a.status, tenum.Finsh).ToSql()); + Assert.Equal(1, fsql.Update(item).Set(a => a.status, tenum.Finsh).ExecuteAffrows()); + item2 = fsql.Select().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(item).Set(a => a.status, tenum.Pay).ToSql()); + Assert.Equal(1, fsql.Update(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().Where(a => a.id == item.id && a.status == (a.id == item.id ? tenum.Pay : tenum.Refunding)).Limit(1).ToSql()); + item2 = fsql.Select().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() { diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/MySql/Curd/MySqlUpdateTest.cs b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/MySql/Curd/MySqlUpdateTest.cs index c823a1fc..ac8f603f 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/MySql/Curd/MySqlUpdateTest.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/MySql/Curd/MySqlUpdateTest.cs @@ -160,6 +160,78 @@ namespace FreeSql.Tests.Odbc.MySql g.mysql.Update().NoneParameter().Where(a => a.id == id).Set(a => a.type, TestEnumUpdateTbType.str1).ExecuteAffrows(); Assert.Equal(TestEnumUpdateTbType.str1, g.mysql.Select().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(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().NoneParameter().AppendData(item).ToSql()); + Assert.Equal(1, fsql.Insert().NoneParameter().AppendData(item).ExecuteAffrows()); + var item2 = fsql.Select().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(item).NoneParameter().Set(a => a.status == (a.id == item.id ? tenum.Pay : tenum.Refunding)).ToSql()); + Assert.Equal(1, fsql.Update(item).NoneParameter().Set(a => a.status == (a.id == item.id ? tenum.Pay : tenum.Refunding)).ExecuteAffrows()); + item2 = fsql.Select().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(item).NoneParameter().Set(a => a.status == tenum.Finsh).ToSql()); + Assert.Equal(1, fsql.Update(item).NoneParameter().Set(a => a.status == tenum.Finsh).ExecuteAffrows()); + item2 = fsql.Select().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(item).NoneParameter().Set(a => a.status == tenum.Pay).ToSql()); + Assert.Equal(1, fsql.Update(item).NoneParameter().Set(a => a.status == tenum.Pay).ExecuteAffrows()); + item2 = fsql.Select().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(item).NoneParameter().Set(a => a.status, tenum.Finsh).ToSql()); + Assert.Equal(1, fsql.Update(item).NoneParameter().Set(a => a.status, tenum.Finsh).ExecuteAffrows()); + item2 = fsql.Select().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(item).NoneParameter().Set(a => a.status, tenum.Pay).ToSql()); + Assert.Equal(1, fsql.Update(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().Where(a => a.id == item.id && a.status == (a.id == item.id ? tenum.Pay : tenum.Refunding)).Limit(1).ToSql()); + item2 = fsql.Select().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() { diff --git a/FreeSql.Tests/FreeSql.Tests/MySql/Curd/MySqlUpdateTest.cs b/FreeSql.Tests/FreeSql.Tests/MySql/Curd/MySqlUpdateTest.cs index 98ce79c2..b216d48b 100644 --- a/FreeSql.Tests/FreeSql.Tests/MySql/Curd/MySqlUpdateTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/MySql/Curd/MySqlUpdateTest.cs @@ -161,6 +161,134 @@ namespace FreeSql.Tests.MySql g.mysql.Update().NoneParameter().Where(a => a.id == id).Set(a => a.type, TestEnumUpdateTbType.str1).ExecuteAffrows(); Assert.Equal(TestEnumUpdateTbType.str1, g.mysql.Select().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(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().NoneParameter().AppendData(item).ToSql()); + Assert.Equal(1, fsql.Insert().NoneParameter().AppendData(item).ExecuteAffrows()); + var item2 = fsql.Select().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(item).NoneParameter().Set(a => a.status == (a.id == item.id ? tenum.Pay : tenum.Refunding)).ToSql()); + Assert.Equal(1, fsql.Update(item).NoneParameter().Set(a => a.status == (a.id == item.id ? tenum.Pay : tenum.Refunding)).ExecuteAffrows()); + item2 = fsql.Select().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(item).NoneParameter().Set(a => a.status == tenum.Finsh).ToSql()); + Assert.Equal(1, fsql.Update(item).NoneParameter().Set(a => a.status == tenum.Finsh).ExecuteAffrows()); + item2 = fsql.Select().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(item).NoneParameter().Set(a => a.status == tenum.Pay).ToSql()); + Assert.Equal(1, fsql.Update(item).NoneParameter().Set(a => a.status == tenum.Pay).ExecuteAffrows()); + item2 = fsql.Select().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(item).NoneParameter().Set(a => a.status, tenum.Finsh).ToSql()); + Assert.Equal(1, fsql.Update(item).NoneParameter().Set(a => a.status, tenum.Finsh).ExecuteAffrows()); + item2 = fsql.Select().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(item).NoneParameter().Set(a => a.status, tenum.Pay).ToSql()); + Assert.Equal(1, fsql.Update(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().Where(a => a.id == item.id && a.status == (a.id == item.id ? tenum.Pay : tenum.Refunding)).Limit(1).ToSql()); + item2 = fsql.Select().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(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().AppendData(item).ToSql()); + Assert.Equal(1, fsql.Insert().AppendData(item).ExecuteAffrows()); + item2 = fsql.Select().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(item).Set(a => a.status == (a.id == item.id ? tenum.Pay : tenum.Refunding)).ToSql()); + Assert.Equal(1, fsql.Update(item).Set(a => a.status == (a.id == item.id ? tenum.Pay : tenum.Refunding)).ExecuteAffrows()); + item2 = fsql.Select().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(item).Set(a => a.status == tenum.Finsh).ToSql()); + Assert.Equal(1, fsql.Update(item).Set(a => a.status == tenum.Finsh).ExecuteAffrows()); + item2 = fsql.Select().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(item).Set(a => a.status == tenum.Pay).ToSql()); + Assert.Equal(1, fsql.Update(item).Set(a => a.status == tenum.Pay).ExecuteAffrows()); + item2 = fsql.Select().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(item).Set(a => a.status, tenum.Finsh).ToSql()); + Assert.Equal(1, fsql.Update(item).Set(a => a.status, tenum.Finsh).ExecuteAffrows()); + item2 = fsql.Select().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(item).Set(a => a.status, tenum.Pay).ToSql()); + Assert.Equal(1, fsql.Update(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().Where(a => a.id == item.id && a.status == (a.id == item.id ? tenum.Pay : tenum.Refunding)).Limit(1).ToSql()); + item2 = fsql.Select().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() { diff --git a/FreeSql/Internal/CommonExpression.cs b/FreeSql/Internal/CommonExpression.cs index 93e78a51..07dfb1d4 100644 --- a/FreeSql/Internal/CommonExpression.cs +++ b/FreeSql/Internal/CommonExpression.cs @@ -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; diff --git a/FreeSql/Internal/CommonProvider/UpdateProvider.cs b/FreeSql/Internal/CommonProvider/UpdateProvider.cs index f5890251..6f04aafd 100644 --- a/FreeSql/Internal/CommonProvider/UpdateProvider.cs +++ b/FreeSql/Internal/CommonProvider/UpdateProvider.cs @@ -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; diff --git a/Providers/FreeSql.Provider.MySqlConnector/MySqlConnectorUtils.cs b/Providers/FreeSql.Provider.MySqlConnector/MySqlConnectorUtils.cs index 8541261f..cdb6996e 100644 --- a/Providers/FreeSql.Provider.MySqlConnector/MySqlConnectorUtils.cs +++ b/Providers/FreeSql.Provider.MySqlConnector/MySqlConnectorUtils.cs @@ -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(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> _dicEnumNames = new ConcurrentDictionary>(); + 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(); + 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) {