我在查看執行簡單選擇查詢時生成的SQL。我首先使用來自nuget的示例博客上下文代碼。在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中產生:
SELECT
[Extent1].[ID] AS [ID],
[Extent1].[PostID] AS [PostID],
[Extent1].[Text] AS [Text],
[Extent1].[Author] AS [Author]
FROM [dbo].[Comments] AS [Extent1]
隨着count
在代碼完成。
原因(我認爲)是因爲第一個返回爲IQueryable
,其中第二個是IEnumerable
。
是否有可能返回第二個查詢爲IQueryable而不執行SQL?
我問的原因是我創建了一個通用的存儲庫層,可以查詢我的實體並將它們轉換爲所需的類型(在上面的示例中可能有幾個不同的只讀對象)。我不希望SQL執行得如此早,因爲可能會在不同情況下進行分頁或進行其他過濾。
這兩個代碼片段是不是完全相同?查詢使用'.Count()'執行,我發現'.Count()'之前的代碼沒有區別。 – Slauma