生成的 SQL 语句没有区别。您可以通过添加此行(实体框架 6)轻松记录 SQL 语句...
context.Database.Log = Console.WriteLine;
这两行...
context.Users.SingleOrDefault(u => u.Id == "foo");
context.Users.Where(u => u.Id == "foo").SingleOrDefault();
两者都使用 SQL Server 提供程序返回完全相同的 SQL 语句...
SELECT
[Limit1].[C1] AS [C1],
[Limit1].[Id] AS [Id],
[Limit1].[UserName] AS [UserName],
[Limit1].[PasswordHash] AS [PasswordHash],
[Limit1].[SecurityStamp] AS [SecurityStamp]
FROM ( SELECT TOP (2)
[Extent1].[Id] AS [Id],
[Extent1].[UserName] AS [UserName],
[Extent1].[PasswordHash] AS [PasswordHash],
[Extent1].[SecurityStamp] AS [SecurityStamp],
'0X0X' AS [C1]
FROM [dbo].[AspNetUsers] AS [Extent1]
WHERE ([Extent1].[Discriminator] = N'ApplicationUser') AND (N'foo' = [Extent1].[Id])
) AS [Limit1]
FirstOrDefault() 也一样:
context.Users.FirstOrDefault(u => u.Id == "foo");
context.Users.Where(u => u.Id == "foo").FirstOrDefault();
两者都生成相同的查询:
SELECT
[Limit1].[C1] AS [C1],
[Limit1].[Id] AS [Id],
[Limit1].[UserName] AS [UserName],
[Limit1].[PasswordHash] AS [PasswordHash],
[Limit1].[SecurityStamp] AS [SecurityStamp]
FROM ( SELECT TOP (1)
[Extent1].[Id] AS [Id],
[Extent1].[UserName] AS [UserName],
[Extent1].[PasswordHash] AS [PasswordHash],
[Extent1].[SecurityStamp] AS [SecurityStamp],
'0X0X' AS [C1]
FROM [dbo].[AspNetUsers] AS [Extent1]
WHERE ([Extent1].[Discriminator] = N'ApplicationUser') AND (N'foo' = [Extent1].[Id])
) AS [Limit1]
您可以看到SingleOrDefault() 执行TOP(2),这是因为它确保只返回1 条记录,而FirstOrDefault() 不在乎。