在我的项目中有供应商模型和用户模型,每个供应商都有几个用户
供应商模型
public class SupplierRow
{
public Guid Id { get; set; }
public string FullName { get; set; }
public bool Subscribed { get; set; }
public bool Active { get; set; }
public int Visits { get; set; }
public bool AllUsersInactive { get; set; }
}
和用户模型
public class UserRow
{
public Guid Id { get; set; }
public string FullName { get; set; }
public string Name { get; set; }
public string Email { get; set; }
public int Status { get; set; }
public int Role { get; set; }
public Guid SupplierId { get; set; }
public bool SupplierIsInactive { get; set; }
}
我检查每个供应商的所有用户是否都没有状态Active
public ActionResult Grid(bool? active)
{
var suppliers = Context.Suppliers.AsNoTracking()
.WhereIf(active != null, e => e.Active == active)
.Select(e => new SupplierRow
{
Id = e.Id,
FullName = e.FullName,
Active = e.Active,
Visits = e.Visits,
})
.ToList();
var supplierIds = suppliers.Select(s => s.Id).ToList();
var suppliersActivityMap = Context.Users.AsNoTracking()
.Where(e => supplierIds.Contains(e.SupplierId.Value))
.Select(e => new
{
Status = e.Status,
SupplierId = e.SupplierId.Value
})
.ToList()
.GroupBy(u => u.SupplierId)
.Select(x => new
{
SuplierId = x.Key,
AllInactive = x.All(u => u.Status != UserStatus.Active)
})
.ToDictionary(x => x.SuplierId);
foreach (var supplier in suppliers)
{
supplier.AllUsersInactive = suppliersActivityMap.ContainsKey(supplier.Id)
? suppliersActivityMap[supplier.Id].AllInactive
: true;
}
return PartialView("_Grid", suppliers);
}
UPD和我有controller for Users
public ActionResult Index(Guid id)
{
var supplierOfUser = Context.Suppliers.AsNoTracking()
//.Include(e => e.Supplier)
.FirstOrDefault(e => e.Id == id);
ViewData.Add("id", id);
ViewData.Add("SupplierFullName", supplierOfUser.FullName);
return View();
}
,我需要在这里添加检查,如果供应商为他的用户具有非活动状态,但我不知道如何进行查询。
这是硬编码没有真正的对象,我希望这是正确的:
public ActionResult Grid(int? status, Pager pager, Guid? supplierId)
{
var sActive = Context.Suppliers.AsNoTracking()
.WhereIf(o=> o.Id == supplierId)
.Select(o=> o.Active).FirstOrDefault();
var page = Context.Users.AsNoTracking()
.Where(e => e.SupplierId == supplierId)
.WhereIf(status != null, e => (e.Status == status))
.Select(e => new UserRow
{
Id = e.Id,
FullName = e.FullName,
Email = e.Email,
Name = e.Name,
Status = e.Status,
Role = e.Role,
SupplierIsInactive = !sActive
})
.GetPage(pager, Sorter.Asc<UserRow, string>(e => e.FullName));
return PartialView("_Grid", page);
}