MappingColumn使用 group_concat会导致返回空实例 返回
SqlSugar
处理完成
15
374

悬赏:0 飞吻
SqlFunc.MappingColumn<string>("group_concat(b.name separator '、')")
使用以上语句会导致返回主键为0的数据,实际上数据库并无数据
热忱回答(15)
-
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 VIP0
2024/7/25用我现成的方法
0 回复 -
fate sta VIP0
2024/7/25看上面文档
0 回复 -
角 VIP0
2024/7/25@fate sta:如果这是bug,我肯定会找其他方法,如果不是bug,是我哪里用法不对吗
0 回复 -
fate sta VIP0
2024/7/25你要看最终这个SQL生成的SELECT是不是和你的字段对应
0 回复 -
fate sta VIP0
2024/7/25你这个不用子查询实现可能会有问题
0 回复 -
fate sta VIP0
2024/7/250 回复 -
角 VIP0
2024/7/25@fate sta:
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 VIP0
2024/7/25你这个DEMO我跑都跑不起来SQL直接报错了
0 回复 -
fate sta VIP0
2024/7/25SELECT `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 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 VIP0
2024/7/25@角:这个我没办法处理,这个是驱动别的,因为换了驱动
老的驱动有性能问题。
0 回复