【发布时间】:2014-03-11 17:00:41
【问题描述】:
我有一个使用 Code First EF 5 的 MVC4 项目。
我有使用公共虚拟 ICollection 的模型,我想设置这些集合中项目的显示顺序。
例如:
假设我有一个订单模型:
public class Order
{
public virtual ICollection<OrderItem> Items { get; set; }
}
和一个 OrderItems 模型:
public Class OrderItem
{
public int ID;
public string name;
public decimal price;
}
我想为每个订单设置 OrderItem 集合的 Order 以降序显示。我该怎么做呢?或者,事实上,有可能吗?
我已尝试添加:
this.Items.OrderByDescending(OrderItem,"price");
到订单模型构造器(胖模型,瘦控制器?)
我也尝试将它添加到控制器动作和视图中,但都没有奏效。
我猜在 DbContext 中可能有一些方法可以做到这一点,但我不得不承认我有点迷路了。
更新:到目前为止,我已根据建议尝试了以下解决方案,但无济于事。
private ICollection<OrderItem> _Items;
public virtual ICollection<OrderItem> Items
{
get { return _Items.OrderByDescending(item => item.Price).ToList(); }
set { _Items = value; }
}
这产生了这个错误:值不能为空。参数名称:来源
我需要在构造函数中添加一些东西吗?
我还尝试在模型中添加一个构造函数以及以下内容:
public OrderItem()
{
this.Items = this.Items.OrderByDescending(i => i.Price).ToList();
}
这没有任何效果。
我也试过了:
this.Items = this.Items.OrderByDescending(OrderItem, "price").ToList();
这会产生错误“OrderItem 是一种类型,但用作变量”。
大家有什么想法吗?
好的。我刚刚将此添加到我的控制器中的详细信息方法中:
public ActionResult Details(int id = 0)
{
order.Items = order.Items.OrderByDescending(item => item.price).ToList();
}
哪个有效。如果可能的话,我仍然想知道为什么会得到;放;解决方案并不仅仅供将来参考。延迟加载、急切加载和显式加载之间的区别在这里也有任何相关性吗?
非常感谢。
好的,所以我尝试了 Ken4z 的建议并补充说:
public Order()
{
_Items = new List<OrderItem>();
}
这可以防止任何错误,但在控制器中调用该操作时实际上不会加载任何项目。可能是一个愚蠢的问题,但无论如何我都会问:
set { _Items = value; }
不是构造函数现在将 value 作为 A List Of OrderItem 传递,其中没有任何内容吗?试图完全掌握这一点。再次感谢您的帮助。
【问题讨论】:
标签: c# asp.net-mvc asp.net-mvc-4 ef-code-first