1

私のリポジトリレイヤーは、ViewModelを直接返すために使用されていました。

public IEnumerable<CommentViewModel> GetComments()
{
   return from c in context.Comments
                 select new CommentViewModel
                 {
                    FirstName = c.FirstName,
                    Comment = c.Comment
                 };
}

次に、リポジトリがビューモデルを返さないようにする必要があることを読んだので、次のように変更しました。

public IEnumerable<Comment> GetComments()
{
   return from c in context.Comments;
}

次に、サービスレイヤーで次のように変更しました。

public IEnumerable<CommentViewModel> GetComments(int postId)
{
   return _repository.GetComments();
}

に:

public IEnumerable<CommentViewModel> GetComments()
{
   var comments = _repository.GetComments();

   return Mapper.Map<IEnumerable<Comment>, IEnumerable<CommentViewModel>>(comments);
}

問題は、以前は7ミリ秒かかり、現在は85ミリ秒かかるクエリです。

どこが間違っているのですか?

生成されたクエリは以前は次のとおりでした(上位5つと順序付けはコントローラーで行われます)。

SELECT TOP (5) [t0].[FirstName], [t0].[Comment]
FROM [dbo].[Comment] AS [t0]
ORDER BY [t0].[CreateDate] DESC 

現在、すべての列が返されています。

SELECT 
[Extent1].[Id] AS [Id], 
[Extent1].[FirstName] AS [FirstName], 
[Extent1].[LastName] AS [LastName], 
[Extent1].[DatePosted] AS [DatePosted], 
[Extent1].[Comment] AS [Comment],
[Extent1].[IPAddress] AS [IPAddress]
FROM [dbo].[Comment] AS [Extent1]
4

1 に答える 1

3

リポジトリレイヤーでクエリ結果を整形する必要があります。そうしないと、AutoMapperはすべてのレコードをデータベースからマップしてモデルを表示するようにプルします。

public IEnumerable<Comment> GetComments(int skip, int count)
{
   return context.Comments.OrderByDescending(c => c.CreateDate).Skip(skip).Take(count);
}
于 2012-07-17T09:23:07.020 に答える