【问题标题】:Applying global filter to Entity Framework model将全局过滤器应用于实体框架模型
【发布时间】:2012-01-22 10:50:44
【问题描述】:

我有以下数据库架构:

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

【问题讨论】:

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


    【解决方案1】:

    我会选择 List&lt;Int&gt;List&lt;Guid&gt; 或您用于 StoreID 的任何 DataType,并将此列表用作方法中的参数。然后,您最终还可以显示多个商店、单个商店或所有商店的订单。然后简单地使用 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);
      }
    } 
    

    在我看来,这是一个不错的设置。不要将过滤器参数存储在 Session 或其他任何东西中。通过上述方式,该方法可以在应用程序中的多个功能“位置”中使用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-11-08
      • 2015-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-13
      相关资源
      最近更新 更多