为什么 Entity Framework 在仅获取 table 行时触发两个 SQL 查询?

Why does Entity Framework fire two SQL queries when simply fetching table rows?

我正在使用 Entity Framework 6.1.3,当我通过 username/password 获取用户时,如下所示。 EF 实际上向数据库触发了两个 SQL 查询。我使用 SQL Server Profiler 检查查询调用。通过防止第二次调用,我可以减少执行时间。

C# 代码:

Dim oSelectedUser As User = (From oUser As User In oDataContainer.Users Where (oUser.UserName = pUserName And oUser.msPassword = pPassword) Select oUser Where oUser.IsActive = True).SingleOrDefault

查询 #1:

SELECT TOP (2) 
    [Extent1].[Id] AS [Id], 
    [Extent1].[UserName] AS [UserName], 
    [Extent1].[Password] AS [Password], 
    [Extent1].[Image] AS [Image]
FROM [dbo].[User] AS [Extent1]
WHERE 
    ([Extent1].[UserName] = @p__linq__0) AND ([Extent1].[Password] = @p__linq__1)

查询 #2:

exec sp_executesql N'SELECT TOP (2) 
    [Extent1].[Id] AS [Id], 
    [Extent1].[UserName] AS [UserName], 
    [Extent1].[Password] AS [Password], 
    [Extent1].[Image] AS [Image]
    FROM [dbo].[User] AS [Extent1]
    WHERE ([Extent1].[UserName] = @p__linq__0) AND ([Extent1].[Password] = @p__linq__1)',N'@p__linq__0 nvarchar(4000),@p__linq__1 nvarchar(4000)',@p__linq__0=N'usr',@p__linq__1=N'zReNgKelg'

Sql 分析器事件:

这两个事件本质上向您展示了相同的说法。 RPC:Completed 事件用于整个调用完成时,SP:Stmt 用于存储过程中的语句完成时。在这种情况下,它们是一回事。