我有一个数据库,我在其中存储模型如下所示的订单:
public class Order
{
public int OrderId { get; set; }
public int ProductId { get; set; }
public decimal UnitPrice { get; set; }
public int Quantity { get; set; }
public int UserId { get; set; }
public DateTime Date { get; set; }
public bool IsConfirmed { get; set; }
public bool IsSettledWithSalary { get; set; }
public virtual Product Product { get; set; }
public virtual User User { get; set; }
}
因此订单链接到产品(对于订购了新订单的每个产品)以及订单执行的用户。如果某人的订单已确认且IsSettledWithSalary为真,如果已从工资中推断出特定订单,则属性IsConfirmed为true。
现在我想创建一个显示用户余额和名称的表格,即显示用户名称,其后面是已确认但尚未从工资中推断出的订单总和。
为此,我将以下元组发送到控制器中的视图:
var users = db.Orders.Include(o => o.User)
.Where(o => o.IsConfirmed == true &&
o.IsSettledWithSalary == false)
.GroupBy(order => order.UserId)
.Select(user => user.FirstOrDefault());
var balances = db.Orders
.Where(order => order.IsConfirmed == true &&
o.IsSettledWithSalary == false)
.GroupBy(order => order.UserId)
.Select(group => group.Sum(order => order.UnitPrice
* order.Quantity) );
return View(Tuple.Create(users.ToList(), balances.ToList()));
然后在视图中我使用模型
拾取元组@model Tuple<List<Models.Order>, List<Decimal>>
并使用Model.Item1和Model.Item2访问它们,并使用foreach循环设置表中薪水旁边的每个用户。
我发现这个解决方案非常难看并且可能容易出错,所以我想创建一个更好的查询/ lambda表达式来发送到视图。
是否可以在不制作元组的情况下将用户名和余额发送到视图?如果是这样,怎么样?
答案 0 :(得分:3)
使用“ViewModel”或者您可以计算属性然后将其粘贴在ViewBag / ViewData
上示例ViewModel:
class OrderTotalViewModel
{
public string User {get;set;}
public decimal Total {get;set;}
}
填充:
var users = db.Orders.Include(o => o.User)
.Where(o => o.IsConfirmed == true &&
o.IsSettledWithSalary == false)
.GroupBy(order => order.UserId)
.Select(group => new OrderTotalViewModel
{
User = u.First().Name, // or u.FirstName etc...
Total = u.Sum(order => order.UnitPrice * order.Quantity)
});
在视图中:
Name: @Model.User
Total: @Model.Total