为什么 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 用于存储过程中的语句完成时。在这种情况下,它们是一回事。
我正在使用 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 用于存储过程中的语句完成时。在这种情况下,它们是一回事。