Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

decimal/double 等带非整型的类型在更新时带上条件判断时,解析SQL语句错误 #1062

Closed
exf opened this issue Mar 31, 2022 · 6 comments

Comments

@exf
Copy link

exf commented Mar 31, 2022

问题描述及重现步骤:

decimal/double 等带非整型的类型在更新时带上条件判断时,解析SQL语句错误

【C#代码】

// DTO
public class TestDto
{
    public decimal ratio { get; set; }
}

// 测试例子
var test = new TestDto();
test.ratio = 2.1M;
var sql = fsql.Update<tbOrder>().Set(m => new tbOrder
{
    is_lock = test.ratio < 1  //这里生成的SQL语句有问题 ratio = 0.9 或 1.9 或 2.1 等等都是生成的是1
}).Where(m => test.ratio < 1).ToSql();

【生成后的MYSQL语句】

# 这是程序生成的:
UPDATE `tb_order` SET `is_lock` = 1 < 1 WHERE (2.1 < 1)
--------------------
# 正常应该生成应该和Where生成一样,是ratio的真实的值:
 `is_lock` =  2.1 < 1 

数据库的具体版本

mysql 5.7
#应该和数据库版本无关,因为生成的SQL语句有问题

安装的包

之前用的3.0.100,以为更新后有解决,现升级为:3.2.300,问题还是一样
<PackageReference Include="FreeSql.Extensions.Linq" Version="3.2.300" />
<PackageReference Include="FreeSql.Provider.MySql" Version="3.2.300" />
<PackageReference Include="FreeSql.Repository" Version="3.2.300" />

.net framework/. net core? 及具体版本

. net core(.net 5+)
@exf exf changed the title decimal/double 等带非整的类型在更新时带上条件判断时,解析SQL语句错误 decimal/double 等带非整型的类型在更新时带上条件判断时,解析SQL语句错误 Mar 31, 2022
@2881099
Copy link
Collaborator

2881099 commented Mar 31, 2022

您的意思 3.0.100 没有该问题吗?

@exf
Copy link
Author

exf commented Mar 31, 2022

您的意思 3.0.100 没有该问题吗?

任何版本都是这个问题。

我现在的处理办法是:

is_lock = test.ratio < 1  ? true : false

@2881099
Copy link
Collaborator

2881099 commented Mar 31, 2022

确实有该问题,为什么涉及解析转换,非常不好处理。

也可以定义变量解决:

var is_lock = test.ratio < 1 ? true : false;

is_lock = is_lock

@exf
Copy link
Author

exf commented Mar 31, 2022

确实有该问题,为什么涉及解析转换,非常不好处理。

也可以定义变量解决:

var is_lock = test.ratio < 1 ? true : false;

is_lock = is_lock

确实,昨天发现这个问题后,采用的就是这个办法,在外面定义了一个变量,然引用这个变量。
今天就抽了点时间研究了一下。尝试了各种方式,因为有时候还有这种情况。

#C#
is_lock = (m.is_lock && test.ratio < 1) ? true : false
//这种生成出来的非常漂亮。
//SQL输出,这种就能识别出来
`is_lock` = case when `is_lock` AND 2.1 < 1 then 1 else 0 end

@2881099
Copy link
Collaborator

2881099 commented Mar 31, 2022

现在只单纯针对 Update 这地进行处理吧。

UPDATE TestDto SET is_lock = 2.1 < 1
WHERE (2.1 < 1)

有些数据库执行这种 SQL 会报错,要用 case when 2.1 < 1 then 1 else 0 end

@exf
Copy link
Author

exf commented Mar 31, 2022

谢谢你的回复。目前先就这种办法都解决。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants