エンティティフレームワークを使用して複数のエンティティを操作する場合、リポジトリパターンを使用する正しい方法は何ですか?複数のリポジトリを使用する正しい方法は何ですか?
すべてのエンティティのリポジトリを作成する必要がありますか?
例:
以下のエンティティを持つ:記事、カテゴリ、コメント。
それぞれのリポジトリを用意する必要がありますか?
:私は
public class ArticlesRepository : BaseArticleRepository
{
public Article GetArticleById(int id)
{
var article = Contentctx.Articles.Where(o => o.ArticleID == id).FirstOrDefault();
return article;
}
public List<Article> GetArticles()
{
var articles = Contentctx.Articles.ToList();
return articles;
}
public List<ArticleHeader> GetArticlesHeaders()
{
var articles = (from article in Contentctx.Articles
select new ArticleHeader
{
ArticleID = article.ArticleID,
Title = article.Title,
CategoryTitle = article.Articles_Categories.Title,
AddedBy = article.AddedBy,
AddedDate = article.AddedDate,
ViewCount = article.ViewCount
}).ToList();
return articles;
}
public List<ArticleHeader> GetArticlesHeaders(int PageIndex, int PageSize)
{
var articles = (from article in Contentctx.Articles
select new ArticleHeader
{
ArticleID = article.ArticleID,
Title = article.Title,
CategoryTitle = article.Articles_Categories.Title,
AddedBy = article.AddedBy,
AddedDate = article.AddedDate,
ViewCount = article.ViewCount
}).OrderBy(p => p.AddedDate).Skip(PageSize * PageIndex).Take(PageSize).ToList();
return articles;
}
public int GetArticleCount(string txtFilter)
{
int ret = Contentctx.Articles.Where(o => o.Title.Contains(txtFilter)).Count();
return ret;
}
public int AddArticle(Article article, int categoryId)
{
Contentctx.AddToArticles(article);
}
}
基本的にすべてのリポジトリは(フィルタと並べ替えを使用してデータを取得を含む)すべてのCRUDデータを実装し、しかし:記事のための
public class BaseArticleRepository : BaseRepository
{
private ContentModel _contentctx;
public ContentModel Contentctx
{
get
{
if ((_contentctx == null))
{
_contentctx = new ContentModel();
}
return _contentctx;
}
set { _contentctx = value; }
}
// IDisposable Support code comes here....
}
とサンプルリポジトリリポジトリはデータを取得して挿入(削除)するための基本的で汎用的な関数しか実装していないので、これは間違ったリポジトリパターンの実装であることをいくつかのブログで読んでいます。
すべての並べ替えは、メモリ内でローカルに行う必要があります。
しかし、私はサーバー側(sqlserver)でこれまでにできることを実行します。
タイトルと要約だけが必要な場合は、データベースからすべての記事(すべてのフィールドを含む)を読み込む必要がありますか?
"すべての並べ替え、フィルタリングはメモリ内でローカルに行う必要があります。" - どこを読んだのですか?どのバックエンドを使用しているのかはっきりしていませんが、確かにsqlクエリでは、メモリで行うよりもはるかに効率的にデータをソート/フィルタできます。フィルタリングするデータ行が100万行ある場合はどうなりますか? –