1

我在SQL Server 2008数据库中创建了一个名为Orders的表。此表的列包含dateCreated类型Date,CustomerId,InvoiceTypeId,InvoiceId等我也有发票,客户和InvoiceType表。使用MVC3和ADO.NET实体数据模型过滤数据

我已经创建了我的数据库查看,我所有这些表连接在一起,只选择了几列我感兴趣的

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

这是一种合理的方法吗?

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

我猜这样做有两种方法。

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

  2. 添加到数据库视图一些额外的SQL代码,像WHERE(dateCreated会BETWEEN @StartDate和@EndDate),然后有从DB每次我们改变滤波器时间读取模型。如果Orders表中有大量记录,那么这样做会很好,而且我们通常只对观看最后一周或几天感兴趣。这可能与MVC3方法有关吗?如何做呢?

回答

2

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

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

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

2)添加到数据库视图一些额外的SQL代码,类似WHERE (dateCreated会BETWEEN @StartDate与@EndDate),然后让模型 从DB每次我们更换过滤器时读取。这很好,如果 订单表中有大量的记录,我们通常只有兴趣查看可能是上周或几天。 这可能与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 }); 
相关问题