2

私は、次の集約ルートがあるとします。ページングエンティティ(EF)

public class Aggregate 
{ 
    public int Id {get; set;} 

    public List<Entity> Entities {get; set;} 
} 

そして、次のリポジトリ:

public class AggregateRepository 
{ 
    public Aggregate GetPaged(int Id) 
    { 
    return db.Aggregate 
       .Include(x=>x.Entities) 
       .Find(id)    
    } 
} 

が質問:どのようにすることができます私はエンティティのページされた並べ替えのリストを取得?エンティティをページングしてソートするのに最適なアプローチはどれですか?集計情報もありますか?

編集:

次のアプローチについてどう思いしていますか?

public class AggregateRepository 
    { 
     public IEnumerable<Entity> GetEntitiesPaged(int id) 
     { 
     return db.Aggregate 
        .Include(x=>x.Aggregate) 
        .Where(x=>x.Id = id) 
        .Select(x=>x.Entities) 
        .Take(20);   
     } 
    } 

代わりの集合オブジェクトを返し、Iは、集約オブジェクトと(この場合20のエンティティ)エンティティのリストを受信することができる含ま。それはDDDパターンの集合体を扱う良いアプローチですか?

+0

有用な答えを得るために、エンティティのページングされソートされたリストで達成しようとしていることを知りたいと思います。 - 書き込みまたは読み取りモデルにエンティティのページおよびソートされたリストが必要ですか? - このページを使用してエンティティをユーザーに表示しますか? - ドメイン内の不変条件を適用するために、エンティティをページ単位で(クエリで)読み込みますか? –

答えて

1

簡単な答えは、ドメインモデルのクエリを避けることです。

必要に応じて、読み込みモデルを持つ特殊なクエリレイヤーを使用します。そうでなければDataRowのような生のもの。

更新

あなたは照会時に凝集体を作成しないように試してみてください。これは、リポジトリにアクセスしないことを意味します。クエリレイヤーは次のようになります。

public interface ISomethingQuery 
{ 
    IEnumerable<SomethingDto> GetPage(SearchSPecification specification, int pageNumber); 
    // -or- 
    IEnumerable<DataRow> GetPage(SearchSPecification specification, int pageNumber); 
} 

このクエリインターフェイスの実装を使用して、表示/レポートに必要なデータを取得します。

+0

お返事ありがとうございます:)あなたが言うときは: "読み込みモデルで特殊なクエリレイヤーを使用する"、GetPaged()メソッドを呼び出した後、メモリ内のすべてのデータを取得することをやっていますか?このようにして、エンティティに多くのデータがあると、パフォーマンスが低下し、これを避けたいと考えています。 DataRowオプションは、アプリケーションのアプローチを変更しなければならないため、今は選択肢ではありません。 私の投稿を編集しました。あなたがコメントしたいと思うなら、私はそれを感謝:) – ASantos

+0

私は問題をもっと光を発する答えを更新しました:) –

1

最初に、書き込み側(コマンド)を読み取り側(クエリ)から分離する必要があります。これはCQRSと呼ばれます。あなたはこれを見ることができますexample

エンティティのページされソートされたリストを取得したいだけなら、次の方法を使用できます。

public ICollection<Aggregate> GetSortedAggregates(AggregateListFilter filter, out int rowCount) 
{ 
    var query = (base.Repository.CurrentSession() as ISession).QueryOver<Aggregate>(); 

    query = query.And(q => q.Status != StatusType.Deleted); 

    if (!string.IsNullOrWhiteSpace(filter.Name)) 
     query = query.And(q => q.Name == filter.Name); 

    rowCount = query.RowCount(); 

    switch (filter.OrderColumnName) 
    { 
     case ".Name": 
      query = filter.OrderDirection == OrderByDirections.Ascending ? query.OrderBy(x => x.Name).Asc : query.OrderBy(x => x.Name).Desc; 
      break; 
     default: 
      query = filter.OrderDirection == OrderByDirections.Ascending ? query.OrderBy(x => x.Id).Asc : query.OrderBy(x => x.Id).Desc; 
      break; 
    } 

    if (filter.CurrentPageIndex > 0) 
    { 
     return query 
     .Skip((filter.CurrentPageIndex - 1) * filter.PageSize) 
     .Take(filter.PageSize) 
     .List(); 
    } 

    return query.List(); 
}