【问题标题】:Filtering data with MVC3 and ADO.NET Entity Data Models使用 MVC3 和 ADO.NET 实体数据模型过滤数据
【发布时间】:2012-02-02 22:05:17
【问题描述】:

我在我的 SQL Server 2008 数据库中创建了一个名为 Orders 的表。此表的列包括 dateCreated 类型的 Date、CustomerId、InvoiceTypeId、InvoiceId 等。我还有 Invoice、Customer 和 InvoiceType 表。

我在我的数据库中创建了一个视图,将所有这些表连接在一起,只选择我感兴趣的几列。

在我的 MVC3 Visual Studio 项目中,我创建了一个 ADO.NET 实体数据模型来表示 db 视图。我还创建了一个非常简单的控制器。最后,我创建了一个带有 WebGrid 的剃刀视图来显示我的订单。它工作正常。

这种方法合理吗?

假设我现在希望向我的剃须刀页面添加可用于过滤 WebGrid 内容的开始日期和结束日期的功能,我该怎么做?

我猜有两种方法可以做到这一点。

  1. 将所有数据从 db 视图加载到实体模型中。然后过滤代码可能会添加到剃须刀代码中。每次更改过滤器时都不需要读取 db,因为所有数据都已在模型中。

  2. 向数据库视图添加一些额外的 sql 代码,例如 WHERE (dateCreated BETWEEN @StartDate AND @EndDate),然后在每次更改过滤器时从数据库中读取模型.如果 Orders 表中有大量记录并且我们通常只对查看最近一周或几天的记录感兴趣,这将是一件好事。这可能与 MVC3 方法有关吗?怎么办?

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-3 razor ado.net ado.net-entity-data-model


    【解决方案1】:

    我不会推荐你的方法。您的数据库视图只是一个投影。您可以使用 LINQ 进行预测。使用 LINQ,您可以进行各种预测,并且易于维护。

    1) 将 db 视图中的所有数据加载到实体模型中。然后 可能会在剃须刀代码中添加过滤代码。数据库应该 每次更改过滤器时都不需要读取,因为所有数据 已在模型中。

    推荐的方法是根据您的过滤条件和您要显示的列构建一个 LINQ 查询。过滤将在数据库中完成。让数据库做它最擅长的事情(过滤),让 Razor 做它擅长的事情(演示)。

    2) 向数据库视图添加一些额外的 sql 代码,例如 WHERE (dateCreated BETWEEN @StartDate AND @EndDate) 然后有模型 每次我们更改过滤器时从数据库中读取。这会很好,如果 Orders 表中有大量记录,我们是 通常只对查看可能是最后一周或几天感兴趣。 这可能与 MVC3 方法有关吗?怎么办?

    可以再次使用 LINQ 应用日期过滤器,并且过滤将在数据库中完成。

    示例代码

    var query = db.Invoices;
    
    if (!string.IsNullOrWhiteSpace(model.CustomerName))
    {
         query = query.And(i => i.Customer.Name.StartsWith(model.CustomerName));
    }
    
    if (model.InvoiceTypeId != null)
    {
         query = query.And(i => i.InvoiceTypeId == model.InvoiceTypeId.Value);
    }
    
    return query.Select(i => new InvoiceDto { i.Amount, Customer = i.Customer.Name });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-04
      • 1970-01-01
      • 2018-01-07
      • 2016-09-16
      • 1970-01-01
      • 2012-02-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多