Where方法中,指定bool变量(非表达式)作为条件生成的sql语句有问题 返回
例如:
1. 场景1
var isAutoReg = true;
var bb = db.Queryable<RecipeEntity, RecipeDetailEntity, UsageEntity>((rp, det, u) => new object[]
{
JoinType.Inner, det.RecipeId == rp.RecipeId && rp.Status == 2,
JoinType.Inner, u.UsageId == det.UsageRouteId,
}).Where((rp, det, u) => rp.ClinicId == clinicId && rpDetailIds.Contains(det.RecipeDetId))
.Where((rp, det, u) => u.Category == 2 ||
u.Category == 3 || u.Category == 4
|| (isAutoReg && det.IsSkinTest == 1 && det.SkinTestSign == 3))
.Any();
直接使用isAutoReg (true)作为条件,生成的sql语句有问题,sql如下:
SELECT TOP 1 1 FROM [CT_Recipe] [rp] WITH(NOLOCK) Inner JOIN [CT_RecipeDetail] [det] WITH(NOLOCK) ON (( [det].[RecipeId] = [rp].[RecipeId] ) AND ( [rp].[Status] = 2 )) Inner JOIN [Sys_Usage] [u] WITH(NOLOCK) ON ( [u].[UsageId] = [det].[UsageRouteId] ) WHERE (( [rp].[ClinicId] = N'1111' ) AND ([det].[RecipeDetId] IN ('111','22')) ) AND (((( [u].[Category] = 2 ) OR ( [u].[Category] = 3 )) OR ( [u].[Category] = 4 )) OR (( 1 AND( [det].[IsSkinTest] = 1 )) AND ( [det].[SkinTestSign] = 3 )))
不能正确生成1 = 1 条件,会直接生成一个1
2. 场景2,改写成isAutoReg == true 能生成正确的:1 = 1
3. 场景3,改写成isAutoReg == false 生成正确的:1 = 0
热忱回答(7)
-
CodingLife VIP0
2025/8/19前提: isAutoReg是true
|| (isAutoReg && det.IsSkinTest == 1 && det.SkinTestSign == 3)) 这个位置如果写的是:!isAutoReg
他会生成 NOT 1,他不会计算这个表达式的最终值是true,还是false,然后对应的去生成1=1或1=0...他是完全的翻译: ! 翻译成NOT ;true翻译成1;false翻译成0.。。
所以,写成 isAutoReg == true,可以翻译成 1 == 1 ;成 isAutoReg == 0 翻译成 1==0
如果: isAutoReg是false
写 isAutoReg == true 会翻译成:0 == 1;写成 0== 0
0 回复 -
fate sta VIP0
2025/8/19处理中
0 回复 -
fate sta VIP0
2025/8/19SqlSugarCore 5.1.4.200-preview31
已修复
0 回复 -
CodingLife VIP0
2025/8/19@fate sta:老师你没有处理!逻辑吗?

!逻辑,没有按照最终的bool值,生成true: 1=1 false:1=0 而是生成的NOT 1
0 回复 -
fate sta VIP0
2025/8/19这个我看一下
0 回复 -
fate sta VIP0
2025/8/19SqlSugarCore 5.1.4.200-preview32
已处理
0 回复 -
CodingLife VIP0
2025/8/20@fate sta:谢谢, 测试全部通过
0 回复