C# 选择具有LINQ TO SQL的单行
我开始处理LINQtoSQL,并尝试解决这个原始问题。 我有一个非常简单的表,有两列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
- 尼克-基,独一无二
- 密码
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,它返回空值(或者说是默认值)如果找不到任何内容。