5.0.0.20版本需求征集 返回

SqlSugar 老数据
20 2365

之前5.0.0.19 问题 http://www.donet5.com/Ask/9/11061 基本上都修复了,有问题全部到这个贴子上回复 

热忱回答20

  • LYL LYL VIP0
    2020/10/16

    动态组装查询 可否添加Db.Queryable或者子查询?

    0 回复
  • @LYL:子查询肯定是不安全的不支持的,你可以先查出来然后用in去实现


    conModels.Add(new ConditionalModel{ FieldName = "id", ConditionalType = ConditionalType.In,FieldValue = "一,二,三"});

    0 回复
  • 1111111 1111111 VIP0
    2020/10/21

    PostgreSql里面当字段类型是定长字符串时,建表没问题,查询会有问题,

    字段定义:

     [SugarColumn(ColumnDataType = "character", Length = 50, ColumnDescription = "这是个定长测试", IsNullable = false)]
            public string Test { set; get; }

    查询报错:

    "Message": "Requested value 'char' was not found.",


    0 回复
  • @1111111character(50)

    0 回复
  • 自定义类型把长度都指定好

    0 回复
  • 请问下, 如果我要实现falsedelete(软删除或假删除)的功能,会用到updateable,而里面有自动更新时间的字段(mysql 的 On update CURRENT_TIMESTAMP) ,需要最终sql 是类似这样 update T as t set falseDelColumn=true , updatedAt = t.updatedAt where pk = idvalue , 目前看文档比较好实现的方案是用 db.updateable<T>(dictionary) 的方案了, 但遇到问题是 上述 updatedAt 的字段需要用到数据库本身的取值,请问下有没有解决方案啊?

    0 回复
  • @ぷ暴走丁貝羅:补充下描述: 目的是避免自动更新时间的字段,在这个时候不要自动更新时间, 因为业务上作删除(假,软)不是个更新操作 .在orm层面,是否可以加入个 SqlFunc.FieldValue("字段名") 的方式,让用户可以实现取数据库的取值呢?

    0 回复
  • @ぷ暴走丁貝羅http://www.donet5.com/Home/Doc?typeId=1195 假删除

    0 回复
  • @fate stay night:问题是我需要更新一个字段不是一个常量,不是 isDelete 的字段, 是更新时间 = 数据库原字段, 比如 需要 update set id = id +1 ,这样的 如何写 id +1 一样, 因为updatedAt 是自动更新字段,需要主动赋值才能保持其不变

    0 回复
  • 还有个小bug, InsertableProvider 的 InsertColumns和IgnoreColumns只判断

    DbColumnName漏了判断 PropertyName 在 updateable 是有判断的 ,如下

    public IInsertable<T> InsertColumns(string[] columns)

    {

    // this.InsertBuilder.DbColumnInfoList = this.InsertBuilder.DbColumnInfoList.Where(it => columns.Any(ig => ig.Equals(it.PropertyName, StringComparison.CurrentCultureIgnoreCase))).ToList();

    this.InsertBuilder.DbColumnInfoList = this.InsertBuilder.DbColumnInfoList

    .Where(it => columns.Any(ic =>

    ic.Equals(it.PropertyName, StringComparison.CurrentCultureIgnoreCase) ||

    ic.Equals(it.DbColumnName, StringComparison.CurrentCultureIgnoreCase)

    )

    ).ToList();

    return this;

    }



    0 回复
  • 想要功能: 读写分离,分表分库,

    0 回复
  • @静待岁月好(?▽?):你是不是没看文档。

    0 回复
  • 报告一个BUG,或者用法不对:

    image.png

    JobPlan是个有很多属性的对象,为了偷懒,这里只要求sugarsql查询某几个字段的属性。

    返回的查询语句为:

    SELECT * FROM (SELECT  "PONO" AS "CMDNO" , "MACHINE" AS "MACHINE" , "HEAT_NO" AS "HEATNO" , "PLAN_START" AS "PLANSTART" , "PLAN_END" AS "PLANEND" , "ACT_START" AS "ACTSTART" , "ACT_END" AS "ACTEND" , "SIM_START" AS "SIMSTART" , "SIM_END" AS "SIMEND" ,ROW_NUMBER() OVER(ORDER BY "PLAN_START" DESC) AS RowIndex  FROM "PL_JOB_PLAN" ) T WHERE RowIndex BETWEEN 1 AND 10


    似乎没什么问题。但是从数据库映射到实体有问题,results数组里的元素,很多字段是null。

    image.png


    当把代码换成如下时:

    image.png

    结果能正确被映射:

    image.png

    数据库是oracle数据库。

    文字版的代码如下:

    var results = dbContext.Queryable<JobPlan>()
                        .Take(10)
                        .OrderBy(s => s.PlanStart, SqlSugar.OrderByType.Desc)
                        .Select(s => new
                        {
                            CmdNo = s.CmdNo,
                            Machine = s.Machine,
                            HeatNo = s.HeatNo,
                            PlanStart = s.PlanStart,
                            PlanEnd = s.PlanEnd,
                            ActStart = s.ActStart,
                            ActEnd = s.ActEnd,
                            SimStart = s.SimStart,
                            SimEnd = s.SimEnd,
                        }).ToList();


    0 回复
  • @原装Zigzag:Oracle数据库,属性名与列名不完全对应,如属性PlanStart对应于列名PLAN_START。以下三种Select的方式有差异:

    var results = dbContext.Queryable<JobPlan>()
                        .Take(10)
                        .OrderBy(s => s.PlanStart, SqlSugar.OrderByType.Desc)
                        // 能正确得到匿名对象。
                        .Select(s => new
                        {
                            CmdNo = s.CmdNo,
                            Machine = s.Machine,
                            HeatNo = s.HeatNo,
                            PlanStart = s.PlanStart,
                            PlanEnd = s.PlanEnd,
                            ActStart = s.ActStart,
                            ActEnd = s.ActEnd,
                            SimStart = s.SimStart,
                            SimEnd = s.SimEnd,
                        }).ToList();
                        
                        // JobPlan的属性为空,当属性与数据库列名不一一对应时(这里是数据库列名是下划线))
                         .Select(s => new JobPlan
                        {
                            CmdNo = s.CmdNo,
                            Machine = s.Machine,
                            HeatNo = s.HeatNo,
                            PlanStart = s.PlanStart,
                            PlanEnd = s.PlanEnd,
                            ActStart = s.ActStart,
                            ActEnd = s.ActEnd,
                            SimStart = s.SimStart,
                            SimEnd = s.SimEnd,
                        }).ToList();
                        
                        // 完全去掉Select方法,返回全属性的JobPlan,能正确返回完整对象。
                        // .ToList();


    0 回复
  • @ぷ暴走丁貝羅

    //实现在原有字段+1
    var result= db.Updateable<Student>()
    .SetColumns(it => it.Num== it.Num+1)
    .Where(it => it.Id == 1)
    .ExecuteCommand();


    0 回复
  • @fate stay night//实现在原有字段+1 传进来的匿名对象或者不知道具体类型(<Student>),这种情况有办法通过字符串获取字段值吗? 比如直接或间接通过字符串 "Num + 1" 

    0 回复
  • @ぷ暴走丁貝羅:就是 Updateable 缺乏字符串 表名 和 字符串 参数 的重载, 达到实现假删除更新 isDeleted = 常量 的同时 更新 Num = Num+1 的目的


    0 回复
  • @ぷ暴走丁貝羅:你可以看看假删除的实现 http://www.donet5.com/Home/Doc?typeId=1195 ,更新一样同新的道理

    0 回复
  • @fate stay night:截图中提到 Select(s=>new {}) 和 Select(s=>new SomeObject{}) 的问题依然存在,新版本还是能重现。

    0 回复
  • @原装Zigzag:更新到最新版本,已解决,抱歉。

    0 回复