使用ICustomConditionalFunc自定义条件时,会多了一个And 语句,脚本执行报错 返回

SqlSugar 沟通中
3 564
该叫什么 Jackey 发布于2024/8/24
悬赏:0 飞吻

使用如下样例查询,产生的查询条件会多了一个And 语句,导致脚本执行报错,但把cdnCode和cdnMatName调换下顺序,就能正常,大佬帮忙解答下是什么原因导致的

--自定义条件
    class customCdn : ICustomConditionalFunc
    {
        public KeyValuePair<string, SugarParameter[]> GetConditionalSql(ConditionalModel conditionalModel, int index)
        {

            var parameterName = "@cp" + index;
            SugarParameter[] pars = new SugarParameter[]
            {
                    new SugarParameter(parameterName, conditionalModel.FieldValue )
            };
            return new KeyValuePair<string, SugarParameter[]>
                ($" {conditionalModel.FieldName} like '%'+{parameterName}+'%'", pars);
        }
    }
    
   --查询样例
        var qry = rep.Context.Queryable<Material>("m")
            .Select(m => new
            {
                Code = m.Code,
                Name = m.Name,
                MatName = m.Code + "_" + (m.Name??"")
            });
        string searchVal = "001";
        var cdnCode = new ConditionalModel() { FieldName = "m.Code", ConditionalType = ConditionalType.Like, FieldValue = searchVal };
        var cdnMatName = new ConditionalModel() { 
            FieldName = "m.Code + '_' + IsNull(m.Name,'')", ConditionalType = ConditionalType.Like, FieldValue = searchVal,
            CustomConditionalFunc = new customCdn(),
        };
        var cdns = new ConditionalCollections
        {
            ConditionalList = new List<KeyValuePair<WhereType, ConditionalModel>>
            {
                new KeyValuePair<WhereType, ConditionalModel>(WhereType.Or,cdnCode),
                new KeyValuePair<WhereType, ConditionalModel>(WhereType.Or,cdnMatName),
            }
        };
        qry = qry.Where(new List<IConditionalModel> { cdns });
        var list = await qry.ToListAsync();

查询脚本如下:

[Sql]:SELECT  [Code] AS [Code] , [Name] AS [Name] ,   [Code]+ @Const0  +ISNULL([Name],@MethodConst1)  AS [MatName]  FROM [PubMaterial] [m]  WHERE  (   [m].[Code] LIKE @Conditm_Code1000   OR  AND  m.Code + '_' + IsNull(m.Name,'') like '%'+@cp2000+'%' )   

[Pars]:

[Name]:@Conditm_Code1000 [Value]:%001% [Type]:String    

[Name]:@cp2000 [Value]:001 [Type]:String    

[Name]:@Const0 [Value]:_ [Type]:String    

[Name]:@MethodConst1 [Value]: [Type]:String   


cdnCode和cdnMatName条件对调顺序后脚本如下:

var cdns = new ConditionalCollections
        {
            ConditionalList = new List<KeyValuePair<WhereType, ConditionalModel>>
            {
                new KeyValuePair<WhereType, ConditionalModel>(WhereType.Or,cdnMatName),
                new KeyValuePair<WhereType, ConditionalModel>(WhereType.Or,cdnCode),
            }
        };


[Sql]:SELECT  [Code] AS [Code] , [Name] AS [Name] ,   [Code]+ @Const0  +ISNULL([Name],@MethodConst1)  AS [MatName]  FROM [PubMaterial] [m]  WHERE  (  m.Code + '_' + IsNull(m.Name,'') like '%'+@cp1000+'%' OR   [m].[Code] LIKE @Conditm_Code2000   )

[Pars]:

[Name]:@cp1000 [Value]:001 [Type]:String

[Name]:@Conditm_Code2000 [Value]:%001% [Type]:String

[Name]:@Const0 [Value]:_ [Type]:String

[Name]:@MethodConst1 [Value]: [Type]:String


热忱回答3

  • fate sta fate sta VIP0
    2024/8/24

    SqlSugarCore 5.1.4.168-preview04


    过五分钟后安装,已修复

    0 回复
  • fate sta fate sta VIP0
    2024/8/24

    勾一下预览

    0 回复
  • Jackey Jackey VIP0
    2024/9/10

    前段时间做项目没有及时上来看,已验证5.1.4.168-preview04版本此问题已解决,非常感谢

    0 回复