2

データベースへの重複したlinqクエリを処理するための正しい方法は何ですか? 重複するクエリとは、コード内で繰り返されるクエリを意味します。

例:

私のコードでは、次のクエリが繰り返されることに気付きました。

dataContext.Users.Where(u =>u.IsActive && u.IsAdmin).OrderByDescent(u => u.Name)

上記のクエリを含むメソッドはどこに配置すればよいですか。そうすべきなのかUserRepository(このままでは悪習である神のクラスで終わることになるだろう)?または、これを処理するクラス アーキテクチャを作成する必要があります。

これについてどうお考えですか。そして、あなたの意見では、どのクラス構造が最も一般的で再利用に対して脆弱でしょうか。

繰り返しクエリの場所としてストア プロシージャを使用できることを念頭に置いていますが、そのようにしたくありません。

4

1 に答える 1

1

はい、 に含めることができますが、標準化されたクエリ (作成、削除など) 用に をUserRepository構築し、またはを使用して のメソッドからの結果をフィルタリングすることもできます。GodclassService LayerExtensionsGetAll()UserRepository

更新
もう少し詳しく表示しようとしています。

  1. データを取得/保存するためのすべてのステートメントを保持する汎用リポジトリを構築します。
  2. リポジトリから消費/リポジトリに送信するサービス レイヤーを作成します。
  3. 特定の結果をフィルタリングする拡張メソッドを追加します。(C# 3.0 に搭載)

いくつかのコード:

// Repository (non-generic)
private IQueryable<User> GetUser()
{
  var results = from u in _db.Users
                select new User
                {
                  ID = u.ID,
                  Username = u.Username,
                  // and so on
                };

  return results;
}


//Service Layer  
private User GetUser(string Username)
{
   User u = _repository.GetUser().WithUsername(username)
                                 .SingleOrDefault();
} 

// Extension Method
public static IQueryable<User> WithUsername(this IQueryable<User> qry, string username)
{
  return from u in qry
         where u.Username == username
         select u;
}

このアプローチは、Rob Conerys MVC StoreFront Preview に関連しています。実装は他のプロジェクトでは異なる場合がありますが、これはそれを行う 1 つの方法です。

于 2012-08-31T08:59:02.543 に答える