使用MVC3和ADO.NET实体数据模型过滤数据

时间:2012-02-02 22:05:17

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

我在SQL Server 2008 db中创建了一个名为Orders的表。此表包含的列包括DateCreated类型为Date,CustomerId,InvoiceTypeId,InvoiceId等。我还有Invoice,Customer和InvoiceType表。

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

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

这是一种合理的方法吗?

让我们说我现在希望在我的剃刀页面添加添加开始日期和结束日期的功能,可以用来过滤WebGrid的内容,我该怎么做?

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

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

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

1 个答案:

答案 0 :(得分:2)

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

  

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

推荐的方法是根据您的过滤条件和要显示的列构建LINQ查询。过滤将在数据库中完成。让数据库尽其所能(过滤)并让Razor做它擅长的(演示)。

  

2)在db视图中添加一些额外的sql代码,类似于WHERE   (dateCreated BETWEEN @StartDate和@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 });
相关问题