C# 从Linq到SQL只读取一行

C# 从Linq到SQL只读取一行,c#,sql-server,linq-to-sql,refactoring,C#,Sql Server,Linq To Sql,Refactoring,我想重构一些C#模块,这些模块通过Linq到SQL从SQLServer2008读取数据。这些存储过程最多只能获取一行,因为我将完整的PK作为参数提交。显然,linqtosql不知道最多只能返回一行。因此,运行以下代码以获取一个值或引发异常: var results = context.MyProcName(myParameter); foreach (var result in results) { return result.THeColumnINeed

我想重构一些C#模块,这些模块通过Linq到SQL从SQLServer2008读取数据。这些存储过程最多只能获取一行,因为我将完整的PK作为参数提交。显然,linqtosql不知道最多只能返回一行。因此,运行以下代码以获取一个值或引发异常:

    var results = context.MyProcName(myParameter);
    foreach (var result in results)
    {
        return result.THeColumnINeed;
    }
    throw new Exception(string.Format("Value not found for parameter {0}", myParameter));
这段代码完成了任务,但看起来有点难看。我怎样才能做得更好?

试试这个:

return context.MyProcName(myParameter).Single().THeColumnINeed;

返回context.MyProcName(myParameter.First()

Single更适合他的用例,因为如果存在多条记录,它会引发异常。因为他的SPR是基于PK返回数据的,所以如果知道他得到了多条记录而不是第一条()返回的任何记录,那就好了。这使得追踪错误(为什么他从SPR中获取多条记录)变得容易得多。我建议使用
.SingleOrDefault()
而不仅仅是
.Single()
避免在找不到记录时出现异常。@Simon没有记录时出现异常正是问题所要求的…@Simon Bondo因为
SingleOrDefault()
几乎肯定会返回
null
如果找不到记录,上面的语句将抛出
NullReferenceException
,这掩盖了真正的问题。OP应该更喜欢
Single()
,在这种情况下,“有点难看”是一种轻描淡写的说法。我的朋友,按照马克的回答,加入世界。:)