単純な選択クエリを実行するときに生成されるSQLを見ています。私は最初にナゲットのサンプルブログのコンテキストでコードを使用しています。select句でメソッドを使用するときのEnitityフレームワークのパフォーマンス
次が実行されている場合:
BlogContext _context = new BlogContext();
var comments = _context.Comments.Select(c => new CommentReadOnly {Author = c.Author});
var count = comments.Count();
次のSQLが生成されます。
カウントが期待されているSQLで行われSELECT
[GroupBy1].[A1] AS [C1]
FROM (SELECT
COUNT(1) AS [A1]
FROM [dbo].[Comments] AS [Extent1]
) AS [GroupBy1]
。
は、しかし、私はこのように見えるようにコードを変更した場合:
BlogContext _context = new BlogContext();
var comments = _context.Comments.Select(c => new CommentReadOnly {Author = c.Author});
var count = comments.Count();
private CommentReadOnly ToCommentReadOnly(Comment comment)
{
return new CommentReadOnly
{
Author = comment.Author,
};
}
次のSQLが生成されますcount
で
SELECT
[Extent1].[ID] AS [ID],
[Extent1].[PostID] AS [PostID],
[Extent1].[Text] AS [Text],
[Extent1].[Author] AS [Author]
FROM [dbo].[Comments] AS [Extent1]
は、コード内で行わ。
最初はIQueryable
として返され、2番目はIEnumerable
と返される理由が考えられます。
SQLを実行せずに2番目のクエリをIQueryableとして返すことはできますか?
私はエンティティにクエリを行い、必要な型に変換できるジェネリックリポジトリレイヤを作成しています(上記の例では、いくつかの異なる '読み取り専用'オブジェクトがあるかもしれません)。私は、ページングが異なる状況で別のフィルタリングが行われるように、SQLを早く実行したくはありません。
2つのコードスニペットはまったく同じではありませんか?クエリは '.Count()'で実行され、 '.Count()'の前にコードの違いは見られません。 – Slauma