任务说明
最近在一个项目里有个任务。任务里涉及到两张表 ------账号表(user),用户审核记录表(userCheck)。
任务要求:父账号的排序 要按照父账号下属的子账号的最新审核记录为 “等待审核”,如果都是 “等待审核” 就再按审核时间排序。
任务里涉及到两张表 ------账号表(user),用户审核记录表(userCheck)。下面是会用到的字段
user表–user表里保存着父级账号和子级账号。
字段名 | 数据类型 | 备注 |
---|---|---|
UserID 账号ID | int | 主键ID |
IsDelete 删除标志 | bit | – |
ParentUserID 所属父账号 | int | – |
userCheck表–userCheck表里保存 user 的审核记录。
字段名 | 数据类型 | 备注 |
---|---|---|
UserCheckID | int | 主键 |
UserID 账号ID | int | 外键ID,关键关联 user 表 |
AfterIsCheck 审核后状态 | tinyint | 0为未审核 |
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(...);
}
结语
第一次写文,各方面没经验,大家手下留情啊!!!!^ _ ^