18

アプリケーションを可能な限り柔軟にしたいのですが、インターフェイスを具体的にしすぎて穴にはまりたくありません。

リポジトリに最適なオブジェクト タイプは何ですか? IEnumerable、IQueryable、またはリスト?

使用を検討している技術は

  • Azure App Fabric キャッシュ

  • エンティティ フレームワーク 4.1

  • おそらく Windows Server AppFabric

4

4 に答える 4

11

エンティティに対して将来のクエリを実行するかどうか、およびこれらをメモリ内に置く必要があるかどうかによって異なります。

  • 将来のクエリがあり、DB が作業を行う必要がある場合は、IQueryable を返します。
  • 将来のクエリがあり、それがメモリ内で実行される場合は、IEnumerable を返します。
  • それ以上のクエリがなく、すべてのデータを読み取る必要がある場合は、IList、ICollection などを返します。
于 2011-11-12T02:45:21.473 に答える
5

IQueryableを使用してDALを構築し、それを渡し、オブジェクトコンテキストの有効期間が要求であることを確認します。このようにすると、実行の遅延のメリットが得られますが、データベースのクエリが非効率になるリスクがあります。

次に、アプリケーション(または少なくともトラフィックを取得する可能性が最も高い部分)のパフォーマンステストを行い、データアクセスパターンを確認します。DALに特殊なメソッドを作成して、完全にマテリアライズされたオブジェクトを取得し、これらのクエリをコンパイル済みのクエリとして作成します。

リポジトリインターフェースのサンプルは次のようになります

  public interface IDataContext
  {
        void Add<T>(T entity) where T : BaseEntity;
        void Delete<T>(T entity) where T : BaseEntity;
        IQueryable<T> Find<T>(Expression<Func<T, bool>> where) where T : BaseEntity;
   }

ここで、BaseEntityはすべてのクラスの基本クラスであり、このクラスはDB内のどのテーブルにもマップされていないようです。

public abstract class BaseEntity
{
        public int Id { get; set; }
        public DateTime CreateDateTime { get; set; }
        public string CreateUser { get; set; }
        public DateTime ModDateTime { get; set; }
        public string ModUser { get; set; }
        public byte[] RowVersion { get; set; }
}

Expression<Func<T, bool>>EFは式を処理してSQLクエリを生成するため、Funcだけでなく、式全体をリポジトリに渡します。通常の使用法は次のとおりです。

ICollection<WFGroup> wgGroups = this.dataContext.Find<WFGroup>((w) => true).ToList();

WFGroupがBaseEntityから派生したクラスである場合、私は通常、遅延読み込みとプロキシを使用し、オブジェクトをコンテキストにデタッチ/アタッチしません。

于 2011-11-17T15:47:34.577 に答える
4

IEnumerableDAL から (コレクションではなく)のカスタム実装を返す必要がある可能性はどれくらいありますか? (この質問に答えるには、以前のプロジェクトを見て、それらのプロジェクトまたは のプロジェクトの数を数えてくださいyield return。)

答えが「あまりない」場合は、配列を返すICollectionか、配列を返します(クエリ結果が誤って変更されるのを防ぎたい場合)。ピンチで、クエリを変更して結果を「ストリーミング」する必要がある場合customIEnumerableの場合、常に古いメソッドで新しいメソッドを呼び出し、結果を具体化して、古いクライアントとの互換性を保つことができます。

于 2011-11-12T03:04:07.683 に答える