OrderByPropertyName提示列名无效 返回

您好,
最近项目应用到以下案例,系统提示‘列名无效’,请帮忙确认一下问题。
SqlSugar版本:v5.1.4.180(NuGet)
Entity中添加了SugarColumn属性,并影射了数据字段名称,例如:public DateTime? LoginTime { get; set; } -- [SugarColumn(ColumnName = "login_time", ColumnDescription = "访问时间")]
当使用SqlSugar的OrderByPropertyName方法,传入"LoginTime", 系统报错,提示“列名"LoginTime"无效”
谢谢!
热忱回答(17)
-
fate sta VIP0
2周前提供完整的代码
0 回复 -
fate sta VIP0
2周前0 回复 -
nelson82 VIP0
2周前代码如下,谢谢。
其中,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 回复 -
小苏 VIP0
2周前@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 回复 -
fate sta VIP0
2周前mergetable 之后是匿名对象当然不行
0 回复 -
fate sta VIP0
2周前OrderByPropertyName只能针对类
0 回复 -
nelson82 VIP0
2周前@fate sta:您好,那我这个问题有什么建议吗?
0 回复 -
fate sta VIP0
2周前@nelson82:你这个代码都是封装过的,跟本不知道你的iqueryable是什么样的。
0 回复 -
fate sta VIP0
2周前T是不是实体,如果T不是实体就不要用OrderByPropertyName
改用 OrderBy
0 回复 -
fate sta VIP0
2周前0 回复 -
nelson82 VIP0
2周前@fate sta:对这个方法传入的是泛型TDto, 但在上层业务调用的时候,是传入具体的类型对象
0 回复 -
nelson82 VIP0
2周前@fate sta:啊?还得写个Demo啊?好麻烦。。。
0 回复 -
nelson82 VIP0
2周前@fate sta:啊,我明白你什么意思了,哈哈哈,我试试
0 回复 -
nelson82 VIP0
2周前@fate sta:解决了,多谢指导!
0 回复 -
小苏 VIP0
2周前@nelson82:怎么解决的?改成order by吗?
0 回复 -
nelson82 VIP0
2周前@小苏:就像fate sta说的,我用的时候并不是Entity,所以没办法使用OrderByPropertyName方法。
queryable是ISugarQueryable, 需要发送到数据库端执行,如果泛型是TEntity的话,那么使用OrderByPropertyName不会报错,但是我封装的是TDto,因此到数据库查询的时候无法映射
如果你从数据库中已经取回List对象了,缓存中操作,就必须使用OrderBy,因为OrderByPropertyName是给实体类提供的方法,我看SqlSugar源码中有映射转换DbColumnName
所以总结:
如果内存中对象需要排序,就使用OrderBy
如果需要数据库端执行排序返回,就使用OrderByPropertyName,但必须传入的是Entity的Property
0 回复 -
nelson82 VIP0
2周前最后我封装的代码如下,测试通过,供你参考。
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 回复