【问题标题】:What is the different between SIngleorDefault code writing concepts in Entity FramewrokEntity Framework 中的 SIngleorDefault 代码编写概念有什么区别
【发布时间】:2014-02-26 04:47:27
【问题描述】:

我已经写了一行,使用 SingleOrDefault 从数据库中获取一行

Context.TableName.SingleOrDefault(x=>x.id==1);

我也写了类似的代码

Context.TableName.Where(x=>x.id==1).SingleOrDefault();

结果给出了相同的值。但我想知道,有什么不同?

我看过一些文章,但他们已经解释了,

没什么区别,只是编码标准的区别。

我认为这两个代码都是标准代码。

如果这两种代码有什么不同,请告诉我。

另外我对这些代码编写概念也有同样的疑问

  • 第一()
  • 单()
  • FirstOrDefault()

【问题讨论】:

  • 我没有编译它。就像示例代码
  • @GrantWinney ,是的。抱歉,我已经更新了

标签: c# linq entity-framework methods coding-style


【解决方案1】:

生成的 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() 不在乎。

【讨论】:

    【解决方案2】:

    如果您想知道 SingleOrDefault 和 FirstOrDefault 或 SingleOrDefault 和 Single 之间的技术或算法差异 - 有很多问题都有很好的答案。例如: LINQ: When to use SingleOrDefault vs. FirstOrDefault() with filtering criteria

    如果你在写作之间有疑问

    Context.TableName.SingleOrDefault(x=>x.id==1);
    

    Context.TableName.Where(x=>x.id==1).SingleOrDefault();
    

    -- 结果当然是一样的。但我的意见 - 第二个样本包含多余的 Where。它不仅在技术上是多余的,而且从代码可读性的角度来看也是多余的。而在第二种情况下,不清楚 - 你对你的期望是什么条件,是不是特别针对某事。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-28
      • 1970-01-01
      • 2021-02-20
      • 2013-03-18
      • 2014-04-03
      • 2016-04-24
      相关资源
      最近更新 更多