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 }); 
相關問題