将全局过滤器应用于Entity Framework模型

时间:2012-01-22 10:50:44

标签: sql asp.net-mvc linq entity-framework

我有以下数据库架构:

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参数,并在应用过滤器之前评估是否为空?

1 个答案:

答案 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);
  }
} 

根据我的说法,这是一个很好的设置。不要将过滤器参数存储在会话或其他任何内容中。以上述方式,该方法可以在您的应用程序中使用/由多个功能“位置”使用。

相关问题