C# 选择具有LINQ TO SQL的单行

C# 选择具有LINQ TO SQL的单行,c#,linq-to-sql,C#,Linq To Sql,我开始处理LINQtoSQL,并尝试解决这个原始问题。 我有一个非常简单的表,有两列 尼克-基,独一无二 密码 我想删除具有某些nick值的行 我使用这种方法: public void DeleteSpiritUser(string nick) { var user = from u in _dc.Spirit_Users where u.Nick == nick select u; using (var scope = new Transa

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

  • 尼克-基,独一无二
  • 密码
我想删除具有某些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是唯一的。

试试这个-只选择第一行(如果有),如果有值,只删除:

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();
       }
   }
}
你可以做:

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

Well First()将提取第一(也是唯一)行(加上它将向查询中添加TOP 1)。Linq2Sql不知道您只有一行(或者您将有任何一行),并且正在准备接收多行,因此即使只有一行,也可以使用IEnmuerable

既然作用域已经用using块声明,并且如果不调用complete方法,事务将中止,那么为什么要放置try-catch?@Davide Piras:原来的问题已经有了——我刚刚复制了它。但我同意——这有点不对劲——要么抓住并处理异常,要么就让它发生并冒泡……@Davide Piras:修正了我的答案——这更有意义!如果发生异常,调用方需要处理它。如果NICK必须是唯一的,则可能需要考虑SUNIORORADY,而不是FrestRealStutial:Mutual(OrDebug)给出了一个错误,如果有两个“NICK”,第一个(OrrError)悄悄地忽略了一个副本。@ Hans Kesting:是的,这是真的-使用
SingleOrDefault
也会导致异常,如果找到多行(无论如何都不会发生,如果
nick
确实是唯一的),那么您应该将此调用放在try…catch中,因为当找不到与
nick
匹配的项时,它会爆炸,或者使用SingleOrDefault,它返回空值(或者说是默认值)如果找不到任何内容。