MappingColumn使用 group_concat会导致返回空实例 返回

SqlSugar 处理完成
15 374
该叫什么 发布于2024/7/24
悬赏:0 飞吻
 SqlFunc.MappingColumn<string>("group_concat(b.name separator '、')")

使用以上语句会导致返回主键为0的数据,实际上数据库并无数据


热忱回答15

  • fate sta fate sta VIP0
    2024/7/24
     //sqlerver : FOR XML PATH
     //mysql sqlite : group_concat
     //oracle : listagg
     //pgsql  :string_agg
     var list= db.Queryable<Order>()
       .Select(it => new
                
                 //names="名字1,名字2,名字3"
                  names=SqlFunc.Subqueryable<custom>().
                                   Where(z=>z.oid==it.id)
                                   .SelectStringJoin(z => z.Name, ",")
                })
               .ToList();
                
    //多字段 不能有null相加 , 字段有null需要加上 z.Name??""
    .SelectStringJoin(z => SqlFunc.MergeString(z.Name,"-",z.Id.ToString()), ",")
     
     
    //去重复
    .SelectStringJoin(it=>SqlFunc.MappingColumn<string>($"distinct {it.UserId}"),".")


    0 回复
  • 角 VIP0
    2024/7/24

    @fate sta:第一点使用的是join查询,第二点是只有在使用group_concat的时候才会出现问题

    db.Queryable<OACarTask>()
                            .LeftJoin<OACarInfo>((a, b) => JsonContains(a.CarsId, b.Id))
                            .LeftJoin<User>((a, b,c) => JsonContains(a.UsersId, c.Id))
                            .OrderByDescending(a => a.CreateTime)
                            .Select((a, b,c) =>
                                new
                                {
                                    a.Id,
                                    a.BillNo,
                                    a.Name,
                                    a.Description,
                                    Users = SqlFunc.MappingColumn<string>("group_concat(DISTINCT  c.name separator '、')"),
                                    Cars = SqlFunc.MappingColumn<string>("group_concat(DISTINCT  b.name separator '、')"),
                                    a.DateRange,
                                    a.Destination,
                                    a.State,
                                })


    0 回复
  • fate sta fate sta VIP0
    2024/7/25

    用我现成的方法

    0 回复
  • fate sta fate sta VIP0
    2024/7/25

    看上面文档

    0 回复
  • 角 VIP0
    2024/7/25

    @fate sta:如果这是bug,我肯定会找其他方法,如果不是bug,是我哪里用法不对吗

    0 回复
  • fate sta fate sta VIP0
    2024/7/25

    你要看最终这个SQL生成的SELECT是不是和你的字段对应

    0 回复
  • fate sta fate sta VIP0
    2024/7/25

    你这个不用子查询实现可能会有问题

    0 回复
  • fate sta fate sta VIP0
    2024/7/25

    image.png

    没有重现你的问题,需要提供完整DEMO,下面是提问模版

    https://www.donet5.com/Home/Doc?typeId=2366 

    0 回复
  • 角 VIP0
    2024/7/25

    @fate sta

    1721874078715.png

     public static class SugarHelper
    {
        public static List<SqlFuncExternal> SqlFuncExternal =
            [
                new ()
                    {
                        UniqueMethodName = "JsonContains",
                        MethodValue = (expInfo, dbType, expContext) =>
                        {
                            if (dbType == DbType.MySql)
                            {
                                var right = expInfo.Args[1].IsMember
                                ? $"CONCAT({expInfo.Args[1].MemberName},'')"
                                : expInfo.Args[1].MemberValue.GetType() == typeof(string)
                                    ? $"'\"{expInfo.Args[1].MemberValue}\"'"
                                    : $"CONCAT({expInfo.Args[1].MemberValue},'')";
                                return $" {expInfo.Args[0].MemberName} is not null and JSON_CONTAINS({expInfo.Args[0].MemberName},{right})";
                            }
                            else
                                throw new Exception("未实现");
                        }
                    },
            ];
        public static bool JsonContains(object? jsonArray, object arrayValue)
        {
            throw new NotSupportedException("Can only be used in expressions");
        }
    }
     
        public class Test001
        {
            [SugarColumn(ColumnDescription = "ID", IsPrimaryKey = true, IsIdentity = true)]
            public int Id { get; set; }
            [SugarColumn(IsJson = true)]
            public List<int>? Test002Id { get; set; }
        }
    
        public class Test002
        {
            [SugarColumn(ColumnDescription = "ID", IsPrimaryKey = true, IsIdentity = true)]
            public int Id { get; set; }
            public string Name { get; set; }
        }
    [HttpGet]
    public object Get()
    {
        var db=new  SqlSugarScope(new SqlSugar.ConnectionConfig() {
            ConnectionString = "server=.;uid=sa;pwd=sasa;database=SQLSUGAR4XTEST",
            DbType = DbType.SqlServer,
            IsAutoCloseConnection = true
        });
     
        //建表 
        if (!db.DbMaintenance.IsAnyTable("Test001", false))
        {
            db.CodeFirst.InitTables<Test001>();
             db.CodeFirst.InitTables<Test002>();
        }
      
     
        var test = db.Queryable<Test001>()
                        .LeftJoin<Test002>((a, b) => JsonContains(a.Test002Id, b.Id))
                        .Select((a, b) =>
                            new
                            {
                                a.Id,
                                Users = SqlFunc.MappingColumn<string>("group_concat(DISTINCT b.name separator '、')"),
                            })
                        .ToList();
                        
      
        return result;
    }
    0 回复
  • 角 VIP0
    2024/7/25

    @fate sta:数据库里无数据,但是按照以上写法会返回id为0的数据。去除group_concat查询则无问题,或者数据库里有数据返回结果也是正常的

    0 回复
  • fate sta fate sta VIP0
    2024/7/25

    image.png


    你这个DEMO我跑都跑不起来SQL直接报错了

    0 回复
  • fate sta fate sta VIP0
    2024/7/25
    SELECT  `a`.`Id` AS `Id` , group_concat(DISTINCT b.name separator '、') AS `Users`  FROM `Test001` `a` Left JOIN `Test002` `b` ON  `a`.`Test002Id` is not null and JSON_CONTAINS(`a`.`Test002Id`,CONCAT(`b`.`Id`,''))


    0 回复
  • fate sta fate sta VIP0
    2024/7/25

    设置了sqlmodel可以了

    经过测试不是BUG

    因为SQL就是生成一条空记录,ORM所以返回一条空记录

    解决方案

           .Select((a, b) =>
                            new
                            {
                                a.Id,
                                Users = SqlFunc.MappingColumn<string>("group_concat(DISTINCT b.name separator '、')"),
             })
           .MergeTable()//合并结果
           .Where(it=>it.Id>0)//在过滤


    0 回复
  • 角 VIP0
    2024/7/25

    @fate sta:非常感谢,这就是group_concat无法处理null的问题。

    能麻烦你再看看

    Select<dynamic>("id,json")

    这个json字段无法序列化的问题吗

    0 回复
  • fate sta fate sta VIP0
    2024/7/25

    @角:这个我没办法处理,这个是驱动别的,因为换了驱动

    老的驱动有性能问题。

    0 回复