我可以立即将房产和其他房产的总和发送到视图吗?

时间:2013-11-25 14:54:06

标签: c# linq asp.net-mvc-4 lambda

我有一个数据库,我在其中存储模型如下所示的订单:

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表达式来发送到视图。

是否可以在不制作元组的情况下将用户名和余额发送到视图?如果是这样,怎么样?

1 个答案:

答案 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