2008-09-06 13 views
6

私が取り組んでいるWebアプリケーションの一部は、管理者から1人のユーザーまでのメッセージを表示する領域です。 LINQ to SQLクラスを含むDataAccessプロジェクトと、UIであるWebサイトプロジェクトがあります。私のデータベースには、次のようになります。ベストプラクティスre:LINQ To SQL for data access

ユーザー - > MessageDetail < - メッセージ< - MessageCategory

MessageDetailもIsReadフラグが含まれている結合テーブルです。

メッセージのリストはカテゴリ別にグループ化されています。ページに2つのネストされたListViewコントロールがあります.1つはグループ名を出力し、2つ目はMessageDetailsにバインドされ、メッセージ自体を出力します。を作品

protected void MessageListDataSource_Selecting(object sender, LinqDataSourceSelectEventArgs e) 
{ 
    var db = new DataContext(); 

    // parse the input strings from the web form 
    int categoryIDFilter; 
    DateTime dateFilter; 
    string catFilterString = MessagesCategoryFilter.SelectedValue; 
    string dateFilterString = MessagesDateFilter.SelectedValue; 
    // TryParse will return default values if parsing is unsuccessful (i.e. if "all" is selected"): 
    // DateTime.MinValue for dates, 0 for int 
    DateTime.TryParse(dateFilterString, out dateFilter); 
    Int32.TryParse(catFilterString, out categoryIDFilter); 
    bool showRead = MessagesReadFilter.Checked; 

    var messages = 
     from detail in db.MessageDetails 
     where detail.UserID == (int)Session["UserID"] 
     where detail.Message.IsPublished 
     where detail.Message.MessageCategoryID == categoryIDFilter || (categoryIDFilter == 0) 
     where dateFilter == detail.Message.PublishDate.Value.Date || (dateFilter == DateTime.MinValue) 
     // is unread, showRead filter is on, or message was marked read today 
     where detail.IsRead == false || showRead || detail.ReadDate.Value.Date == DateTime.Today 
     orderby detail.Message.PublishDate descending 
     group detail by detail.Message.MessageCategory into categories 
     orderby categories.Key.Name 
     select new 
     { 
      MessageCategory = categories.Key, 
      MessageDetails = categories.Select(d => d) 
     }; 

    e.Result = messages; 
} 

このコードが、ちょうどdoesnのLinqDataSourceコントロールのためのコードビハインドで次のように巨大なLINQ文を貼り付ける」:私は、次のコードを持つメッセージをリストのページのコードビハインドで私と一緒に座ってください。

私はまだユーザーインターフェイスにクエリをコーディングしているようですが、今はSQLの代わりにLINQです。しかし、L2SクラスとUIの間に別のレイヤーを構築すると、LINQの柔軟性が低下すると感じています。全体のポイントは、データをフェッチするために書くコードの量を減らすことではありませんか?

LINQ to SQLの使用方法を誤解していると思いますか?アドバイスをいただければ幸いです。

答えて

5

すべてのLINQクエリは、ビジネスロジッククラスビジネスロジッククラスで、ADOのような古い方法からの変更はありません。

の場合、の場合は、ビジネスクラスのメソッドから常にList(of T)を返す必要があります。実際には、datacontextはビジネスクラスにのみ表示する必要があります。 その後、ユーザーインターフェイスでリストを操作できます。

のプラグマティターの場合は、IQueryableオブジェクトを返して、ユーザーインターフェイスでいくつかの操作を行うことができます。

+0

これは私が使い終わったアプローチです。役に立つアドバイス、ありがとう。 –

+4

あなたが純粋な人であればIListを返す;)あるいはもっと良いIEnumerable –

1

LINQに関係なく、プレゼンテーションコードとデータベース関連のコードを混ぜるのは良い考えではないと私は思っています。 LINQクエリの上に単純なDB抽象化レイヤを作成します。私の意見では、LINQは従来のアプリケーション設計に大きな影響を与えない便利なツールです。