OrderByPropertyName提示列名无效 返回

SqlSugar 沟通中
17 209
该叫什么 nelson82 发布于2周前
悬赏:0 飞吻

您好,


最近项目应用到以下案例,系统提示‘列名无效’,请帮忙确认一下问题。

  1. SqlSugar版本:v5.1.4.180(NuGet)

  2. Entity中添加了SugarColumn属性,并影射了数据字段名称,例如:public DateTime? LoginTime { get; set; } -- [SugarColumn(ColumnName = "login_time", ColumnDescription = "访问时间")]

  3. 当使用SqlSugar的OrderByPropertyName方法,传入"LoginTime", 系统报错,提示“列名"LoginTime"无效”


谢谢!

热忱回答17

  • 提供完整的代码

    0 回复
  • 0 回复
  • 代码如下,谢谢。

    其中,pageDomain.PropertyName是我的实体属性名称“LoginTime”

    namespace Jordium.Data.Entities
    {
        /// <summary>
        ///  系统访问记录 对象 sys_logininfor
        /// </summary>
        [SugarTable("sys_logininfor", "系统访问记录")]
        public class SysLogininfor : BaseEntity
        {
            /// <summary>
            /// 访问ID (info_id)
            /// </summary>
            [SugarColumn(ColumnName = "info_id", ColumnDescription = "访问ID", IsPrimaryKey = true, IsIdentity = true)]
            public long InfoId { get; set; }
                    
            /// <summary>
            /// 用户账号 (user_name)
            /// </summary>
            [SugarColumn(ColumnName = "user_name", ColumnDescription = "用户账号")]
            public string? UserName { get; set; }
                    
            /// <summary>
            /// 登录IP地址 (ipaddr)
            /// </summary>
            [SugarColumn(ColumnName = "ipaddr", ColumnDescription = "登录IP地址")]
            public string? Ipaddr { get; set; }
                    
            /// <summary>
            /// 登录地点 (login_location)
            /// </summary>
            [SugarColumn(ColumnName = "login_location", ColumnDescription = "登录地点")]
            public string? LoginLocation { get; set; }
                    
            /// <summary>
            /// 浏览器类型 (browser)
            /// </summary>
            [SugarColumn(ColumnName = "browser", ColumnDescription = "浏览器类型")]
            public string? Browser { get; set; }
                    
            /// <summary>
            /// 操作系统 (os)
            /// </summary>
            [SugarColumn(ColumnName = "os", ColumnDescription = "操作系统")]
            public string? Os { get; set; }
                    
            /// <summary>
            /// 登录状态(0成功 1失败) (status)
            /// </summary>
            [SugarColumn(ColumnName = "status", ColumnDescription = "登录状态(0成功 1失败)")]
            public string? Status { get; set; }
                    
            /// <summary>
            /// 提示消息 (msg)
            /// </summary>
            [SugarColumn(ColumnName = "msg", ColumnDescription = "提示消息")]
            public string? Msg { get; set; }
                    
            /// <summary>
            /// 访问时间 (login_time)
            /// </summary>
            [SugarColumn(ColumnName = "login_time", ColumnDescription = "访问时间")]
            public DateTime? LoginTime { get; set; }
                    
        }
    }
    public async Task<SqlSugarPagedList<TDto>> GetDtoPagedListAsync(ISugarQueryable<TDto> queryable)
    {
        var pageDomain = PageUtils.GetPageDomain();
    
        SqlSugarPagedList<TDto> pagedInfo;
        if (!string.IsNullOrEmpty(pageDomain.PropertyName))
        {
            OrderByType? orderByType = (pageDomain.IsAsc ?? "").EqualsIgnoreCase("desc") ? OrderByType.Desc : OrderByType.Asc;
            pagedInfo = await queryable
                .OrderByPropertyName(pageDomain.PropertyName, orderByType)
                .ToPagedListAsync(pageDomain.PageNum, pageDomain.PageSize);
        }
        else
        {
            pagedInfo = await queryable.ToPagedListAsync(pageDomain.PageNum, pageDomain.PageSize);
        }
        pagedInfo.Code = StatusCodes.Status200OK;
    
        // 填充关联表数据
        if (pagedInfo.Rows.IsNotEmpty())
        {
            await FillRelatedDataAsync(pagedInfo.Rows);
        }
    
        return pagedInfo;
    }
    0 回复
  • @fate sta:这个问题就是我之前帖子提到的OrderByPropertyName的问题

    select( it=>new { ColumnC =it.xx + it.yy }).MergeTable().OrderBy("ColumnC")   这样写正常。

    select( it=>new { ColumnC =it.xx + it.yy }).MergeTable().OrderByPropertyName("ColumnC")   这样写报null异常。


    0 回复
  • mergetable 之后是匿名对象当然不行 

    0 回复
  • OrderByPropertyName只能针对类

    0 回复
  • @fate sta:您好,那我这个问题有什么建议吗?

    0 回复
  • @nelson82:你这个代码都是封装过的,跟本不知道你的iqueryable是什么样的。

    0 回复
  • T是不是实体,如果T不是实体就不要用OrderByPropertyName

    改用 OrderBy

    0 回复
  • https://www.donet5.com/Home/Doc?typeId=2366


    按模版提供完整没有封装可以的跑的DEMO。不然就浪费时间。

    0 回复
  • @fate sta:对这个方法传入的是泛型TDto, 但在上层业务调用的时候,是传入具体的类型对象

    0 回复
  • @fate sta:啊?还得写个Demo啊?好麻烦。。。

    0 回复
  • @fate sta:啊,我明白你什么意思了,哈哈哈,我试试

    0 回复
  • @fate sta解决了,多谢指导!

    0 回复
  • @nelson82:怎么解决的?改成order by吗?


    0 回复
  • @小苏:就像fate sta说的,我用的时候并不是Entity,所以没办法使用OrderByPropertyName方法。

    1. queryable是ISugarQueryable, 需要发送到数据库端执行,如果泛型是TEntity的话,那么使用OrderByPropertyName不会报错,但是我封装的是TDto,因此到数据库查询的时候无法映射

    2. 如果你从数据库中已经取回List对象了,缓存中操作,就必须使用OrderBy,因为OrderByPropertyName是给实体类提供的方法,我看SqlSugar源码中有映射转换DbColumnName

    所以总结:

    1. 如果内存中对象需要排序,就使用OrderBy

    2. 如果需要数据库端执行排序返回,就使用OrderByPropertyName,但必须传入的是Entity的Property

    0 回复
  • 最后我封装的代码如下,测试通过,供你参考。

    public async Task<SqlSugarPagedList<TDto>> GetDtoPagedListAsync(ISugarQueryable<TDto> queryable)
    {
        var pageDomain = PageUtils.GetPageDomain();
    
        SqlSugarPagedList<TDto> pagedInfo;
        if (!string.IsNullOrEmpty(pageDomain.PropertyName))
        {
            var entityQueryable = queryable.Select<TEntity>("*");
            var orderType = pageDomain.IsAsc ?? "";
            OrderByType? orderByType = (orderType.EqualsIgnoreCase("descending") || string.IsNullOrEmpty(orderType)) ? OrderByType.Desc : OrderByType.Asc;
            var pangedEntityInfo = await entityQueryable
                .OrderByPropertyName(pageDomain.PropertyName, orderByType)
                .ToPagedListAsync(pageDomain.PageNum, pageDomain.PageSize);
            pagedInfo = pangedEntityInfo.Adapt<SqlSugarPagedList<TDto>>();
        }
        else
        {
            pagedInfo = await queryable.ToPagedListAsync(pageDomain.PageNum, pageDomain.PageSize);
        }
        pagedInfo.Code = StatusCodes.Status200OK;
    
        // 填充关联表数据
        if (pagedInfo.Rows.IsNotEmpty())
        {
            await FillRelatedDataAsync(pagedInfo.Rows);
        }
    
        return pagedInfo;
    }


    0 回复