ASP.NET Core MVC中用LINQ实现Guest数据空值后置排序
问题描述
现有数据库表Guest,数据如下:
Guest1 Guest2 Guest3 Guest4 James Tom Jerry Steve Jones Chris Luke Pet Ron Rob James
需要实现非空字段数量多的行排在顶部,空值多的行排在末尾,期望效果:
Guest1 Guest2 Guest3 Guest4 Pet Ron Rob James Jerry Steve Jones Chris Luke Tom James
当前控制器代码:
var guestNames = await _db.Guest.ToListAsync(); return View(guestNames);
视图通过循环渲染表格,需在控制器中用LINQ实现上述排序逻辑。
解决方案
核心思路是计算每行的非空字段数量,再按这个数量降序排列,具体LINQ实现如下:
var guestNames = await _db.Guest .Select(g => new { Guest = g, NonNullCount = (g.Guest1 != null ? 1 : 0) + (g.Guest2 != null ? 1 : 0) + (g.Guest3 != null ? 1 : 0) + (g.Guest4 != null ? 1 : 0) }) .OrderByDescending(x => x.NonNullCount) .Select(x => x.Guest) .ToListAsync(); return View(guestNames);
逻辑说明
- 先通过
Select为每条数据计算非空字段总数NonNullCount:逐个判断Guest1到Guest4是否非空,非空则加1 - 用
OrderByDescending按NonNullCount从大到小排序,保证非空字段多的行排在最前 - 最后还原为
Guest实体类型,传给视图渲染即可
如果你的实体类中字段是空字符串而非null,可以把判断条件替换为!string.IsNullOrEmpty(g.Guest1),适配实际数据格式。
内容的提问来源于stack exchange,提问作者Jeff
相关产品推荐
相关产品推荐

