【问题标题】:Best way for retrieving single record results in LINQ to SQL在 LINQ to SQL 中检索单个记录结果的最佳方法
【发布时间】:2008-10-15 13:20:31
【问题描述】:

如果我在键字段上查询具有条件的表,如下所示:

        var user = from u in dc.Users
                   where u.UserName == usn
                   select u;

我知道我要么得到零个结果,要么得到一个结果。我应该继续使用 for-each 检索结果,还是有另一种首选方法来处理这种情况。

【问题讨论】:

  • 感谢您提供有关 FirstOrDefault 或 SingleOrDefault 的提示。 LINQ 有很多我还没用过的地方,我可以说还有很多。

标签: linq linq-to-sql


【解决方案1】:

试试这样的:

var user = (from u in dc.Users
                   where u.UserName == usn
                   select u).FirstOrDefault();

FirstOrDefault 方法返回满足指定条件的序列的第一个元素,如果没有找到这样的元素,则返回默认值。

【讨论】:

  • 扩展方法需要“System.Linq”可能一文不值。
【解决方案2】:

为什么不喜欢

var user = dc.Users.SingleOrDefault(u=> u.UserName==usn);

【讨论】:

  • FirstOrDefault 将执行 TOP 1 操作以提高效率。不幸的是 SingleOrDefault 没有做 TOP 2 并选择了整个集合。
  • 不确定这是否总是完全正确,可能取决于版本或确切的语法。当我使用 SingleOrDefault 时,我倾向于看到像这样的 sql 语句:“SELECT TOP (2) col1, col2 FROM (SELECT col1, col2) AS Extent1 WHERE ...” 所以它既是前 2 又不是前 2。 ;-)
【解决方案3】:

还应注意,First/FirstOrDefault/Single/SingleOrDefault 是 LINQ to Sql 命令的执行点。由于在此之前没有执行过 LINQ 语句,因此可以影响生成的 SQL(例如,可以在 sql 命令中添加 TOP 1)

【讨论】:

    【解决方案4】:

    我会使用 First() 或 FirstOrDefault()。

    区别:在First()上如果找不到行会抛出异常。

    【讨论】:

      【解决方案5】:

      我会使用 SingleOrDefault 方法。

      var user = (from u in dc.Users
                         where u.UserName == usn
                         select u).SingleOrDefault();
      

      【讨论】:

        【解决方案6】:

        另一个选项是使用 Contains(username) 而不是 "=="

        var user = (from u in dc.UserInfo 
                              where u.Users.Contains(username) 
                              select u).SingleOrDefault();
        

        【讨论】:

          猜你喜欢
          • 2010-10-14
          • 2010-09-23
          • 1970-01-01
          • 1970-01-01
          • 2017-10-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多