我有以下数据库架构:
Store
StoreId
Name
...
Order
OrderId
StoreId
....
我有一个asp.net mvc后端应用程序,带有这样的数据存储库(简化):
public IQueryable<Order> GetOrders() {
return storeDB.Orders
.OrderByDescending(o => o.DateDue)
.ThenByDescending(o => o.DateCreated);
}
我有类似的代码来显示销售,员工,产品等...我想在应用程序的某处放置一个下拉列表,允许我设置一个全局过滤器,只显示订单,员工,产品等......一个给定的StoreId,如果storeId为null我应该显示所有商店的所有记录(删除过滤器)最好的方法是什么?
我应该在会话中设置storeId并过滤控制器中的数据吗?我应该在我的数据层中添加storeId参数,并在应用过滤器之前评估是否为空?
答案 0 :(得分:3)
我会选择List<Int>
或List<Guid>
或DataType
用于StoreID
的{{1}},并将此列表用作方法中的参数。然后,您最终还可以显示多个商店,单个商店或所有商店的订单。然后简单地使用if语句来检测列表是否包含某些内容或类似内容,例如:
public IQueryable<Order> GetOrders(List<Guid> storeIDs)
{
if(storeIDs == null || storeIDs.Count == 0)
{
return storeDB.Orders
.OrderByDescending(o => o.DateDue)
.ThenByDescending(o => o.DateCreated);
}
else
{
return storeDB.Orders
.Where(o => storeIDs.Contains(o.StoreID))
.OrderByDescending(o => o.DateDue)
.ThenByDescending(o => o.DateCreated);
}
}
根据我的说法,这是一个很好的设置。不要将过滤器参数存储在会话或其他任何内容中。以上述方式,该方法可以在您的应用程序中使用/由多个功能“位置”使用。