【问题标题】:Select single row with LINQ TO SQL使用 LINQ TO SQL 选择单行
【发布时间】:2011-02-04 19:05:16
【问题描述】:

我开始处理 LINQ To SQL 并尝试解决这个原始问题。 我有一个非常简单的两列表格。

  • Nick - 键,唯一
  • 密码

我想删除带有一些昵称值的行。

我用这个方法:

    public void DeleteSpiritUser(string nick)
    {
        var user = from u in _dc.Spirit_Users where u.Nick == nick select u;

        using (var scope = new TransactionScope())
        {
            _dc.Spirit_Users.DeleteOnSubmit(user.First());

            try
            {
                _dc.SubmitChanges();
            }
            catch (Exception exception)
            {
                throw exception;
            }
            scope.Complete();
        }
    }

问题是如果我想要一行,我必须使用 user.First(),我想用 LINQ 选择只有一行知道 IEnumerable,因为 Nick 是唯一的。

【问题讨论】:

    标签: c# linq-to-sql


    【解决方案1】:

    试试这个 - 只选择第一个(如果存在),并且只有在你得到一个值时才删除:

    public void DeleteSpiritUser(string nick)
    {
        var user = (from u in _dc.Spirit_Users 
                    where u.Nick == nick 
                    select u).SingleOrDefault();
    
        if(user != null)
        {
           using (var scope = new TransactionScope())
           {
               _dc.Spirit_Users.DeleteOnSubmit(user);
               _dc.SubmitChanges();
               scope.Complete();
           }
       }
    }
    

    【讨论】:

    • 既然作用域已经用 using 块声明了,如果不调用完整方法,事务将中止,为什么要放置 try-catch?
    • @Davide Piras:最初的问题已经有了 - 我只是复制了它。但我同意 - 这有点偏离 - 要么捕获并处理异常,要么让它发生并冒泡......
    • @Davide Piras:修正了我的答案 - 这更有意义!如果发生异常,调用者需要处理
    • 如果昵称必须是唯一的,您可能需要考虑 SingleOrDefault 而不是 FirstOrDefault:如果有两个“昵称”,Single(OrDefault) 会出错,First(OrDefault) 会静默忽略重复。跨度>
    • @Hans Kesting:是的,这是真的——如果发现不止一行,使用SingleOrDefault 也会导致异常(如果nick 真的是独一无二的,那么无论如何都不应该发生)跨度>
    【解决方案2】:

    你可以这样做:

    var user = _dc.Spirit_Users.Single(u => u.Nick == nick);
    

    【讨论】:

    • 那么你应该把这个调用放在 try..catch 中,因为当找不到 nick 的匹配项时它会爆炸
    • 或者使用 SingleOrDefault,如果没有找到,则返回 null(或者更确切地说是默认值)。
    【解决方案3】:

    Well First() 是提取第一行(也是唯一一行)的行(另外它会将 TOP 1 添加到查询中)。 Linq2Sql 不知道您只有一行(或者您将有任何一行)并且准备接收多个,因此即使有一行也是 IEnmuerable。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多