【开发日记】2020-12-1 复杂排序

1 篇文章 0 订阅
1 篇文章 0 订阅


任务说明

最近在一个项目里有个任务。任务里涉及到两张表 ------账号表(user),用户审核记录表(userCheck)。

任务要求:父账号的排序 要按照父账号下属的子账号的最新审核记录为 “等待审核”,如果都是 “等待审核” 就再按审核时间排序。

任务里涉及到两张表 ------账号表(user),用户审核记录表(userCheck)。下面是会用到的字段

user表–user表里保存着父级账号和子级账号。

字段名数据类型备注
UserID 账号IDint主键ID
IsDelete 删除标志bit
ParentUserID 所属父账号int

userCheck表–userCheck表里保存 user 的审核记录。

字段名数据类型备注
UserCheckIDint主键
UserID 账号IDint外键ID,关键关联 user 表
AfterIsCheck 审核后状态tinyint0为未审核
CheckTime 审核时间DateTime

一开始 是想用 OrderBy的一个很少用的语法来写,自写一个比较器。

OrderBy<TSource, TKey>(this IQueryable<TSource> source, Expression<Func<TSource, TKey>> keySelector, IComparer<TKey> comparer);

但这种方法需要多次查寻数据库,次数多了,代码就崩了,无耐放弃。


解决方案

最后,在 user 的 Model 那加了两属性,LastCheckStatus 和 LastCheckTime 。
用两属性直接先去拿到最新的审核状态和最新审核时间,然后控制器里再进行OrderByDescending 处理

//user Model 
public partial class user
{
    ...
    //这是实体模型。原本是想直接 用‘.’关联到userCheck来使用数据,但修改user时,实体模型不认得相关的表关联,报错
    private Entities _db = new Entities();  
    //先拿到当前账号的所有的审核数据
    private userCheck UserCheck
    {
        get 
        { 
        	return _db.userCheck.Where(u => u.UserID == UserID)
        		.OrderByDescending(u=>u.CheckTime).FirstOrDefault(); 
        }
    }

    // 获取最新审核状态
    public int LastCheckStatus
    {
        get
        {
            var checkStatus = 0;
            if (UserCheck!= null) return UserCheck.AfterIsCheck;
            return checkStatus;
        }
    }
	//获取最新审核时间
    public DateTime LastCheckTime
    {
        get
        {
            var time = UpdateTime ?? DateTime.MinValue;
            if (UserCheck != null) 
            	if (UserCheck.CheckTime != null) 
            		return (DateTime)UserCheck.CheckTime;
            return time;
        }
    }
}

控制器

public ActionResult User(VModelUser t)
{
    ...
    //子账号数据及查询
    var sons = _tbSysUserBll.All.AsEnumerable().Where(u => u.IsDelete == false)
    .Where(...);//这句是过滤子级账号的条件,因为还要用到其它表,这里为了简洁省略了,下面也一样
    //子账号的对应父账号数据
    var fathers = _tbSysUserBll.All.Where(u => u.IsDelete == false)
            .Where(...)
            .ToList()
            //这里先按最近审核状态排    
            .OrderBy(u =>
            {
                var firstOrDefault = sons.Where(x=>x.LastCheckStatus == 0 && x.ParentUserID == u.UserID)
                	.OrderByDescending(x => x.LastCheckTime).FirstOrDefault();
                if (firstOrDefault != null)
                    return firstOrDefault.LastCheckStatus;
                return 2;
            })   
            //这里再按最近审核时间排  
            .ThenByDescending(u =>
            {
                var firstOrDefault = sons.Where(x => x.LastCheckStatus == 0 && x.ParentUserID == u.UserID)
                	.OrderByDescending(x => x.LastCheckTime).FirstOrDefault();
                if (firstOrDefault != null)
                    return firstOrDefault.LastCheckTime;
                return DateTime.MinValue;
            });
     ...
    return View(...);
}

结语

第一次写文,各方面没经验,大家手下留情啊!!!!^ _ ^

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值