1

SQL Server 2008 dbにOrdersというテーブルを作成しました。このテーブルには、dateCreated型のDate、CustomerId、InvoiceTypeId、InvoiceIdなどの列があります。また、Invoice、CustomerおよびInvoiceTypeテーブルもあります。MVC3およびADO.NETエンティティデータモデルを使用したデータのフィルタリング

私は私がに興味があるだけでいくつかの列を選択し、私は一緒にすべてのこれらのテーブルを結合私のデータベースでビューを作成しました。私は、ADO.NETを作成した私のMVC3のVisual Studioプロジェクトで

dbビューを表すエンティティデータモデル。私は非常に単純なコントローラを作成しました。最後に、私はWebGridを使って私の注文を表示するかみそりビューを作成しました。それはうまく動作します。

これは妥当なアプローチですか?

WebGridの内容をフィルタリングするために使用できる開始日と終了日を追加する機能を私のカミソリのページに追加したいとしたらどうすればよいでしょうか?

私はこれを行う2つの方法があると思います。

  1. すべてのデータをdbビューからエンティティモデルにロードします。その後、おそらく剃刀コードにフィルタリングコードが追加されます。すべてのデータが既にモデルに入っているため、フィルタが変更されるたびにdbを読み込む必要はありません。

  2. は、デシベルビューにいくつかの余分なSQLコードを追加します(@StartDateと@EndDate BETWEEN dateCreated)WHEREのようなものと、モデルはデシベルから私たちは、フィルタを変更するたびに読みました。 Ordersテーブルに大量のレコードがあり、通常はおそらく最後の1週間または数日しか表示しない場合、これは良いことです。これはMVC3のアプローチで可能ですか?どのようにそれを行うことができますか?

答えて

2

あなたのアプローチはお勧めできません。あなたのデータベースビューは唯一の投影です。 LINQで投影を行うことができます。 LINQを使用すると、さまざまな予測が可能で、メンテナンスも簡単です。

1)dbビューからのすべてのデータをエンティティモデルにロードします。次に、 フィルタリングコードが、おそらくは剃刀コードに追加されます。すべてのデータ が既にモデルに入っているので、フィルタは変更されるたびに を読み取る必要はありません。

推奨する方法は、フィルタ条件と表示する列に基づいてLINQクエリを作成することです。フィルタリングはデータベースで行われます。データベースができること(フィルタリング)を行い、Razorにはそれがうまくいくようにしましょう(プレゼンテーション)。

2)、デシベルビューに、その後@StartDateと@EndDate)とBETWEEN (dateCreatedモデル はデシベルから私たちは、フィルタを変更するたびに読み込ま持つWHEREのようなものをいくつかの余分なSQLコードを追加します。 受注テーブルに大量のレコードがあり、通常はおそらく最後の週または数日を表示することに興味があるのは です。 これは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 }); 
関連する問題