我在一本书上读到了这个操作符,但由于我不使用那么多的数据库,我想不出任何想要获得单个项目的环境。我的意思是,我可以有一套条件,但后来我会使用First或Last,而不是Single。有什么不同?让它只返回一个项目,如果没有结果或多个项目则抛出异常是什么意思?我想到的唯一事情就是确保只有一个项目。
谢谢!
答案 0 :(得分:6)
这正是你想要的原因。有时,在结果集中有多个项目表示某个地方存在错误,如果不是这样,您会想要抛出异常。
答案 1 :(得分:6)
这里的经典示例是当你有一个id时(因此期望数据以唯一的方式存在于该id中):
var item = ctx.SomeTable.Single(x=>x.Id == id);
您可以检查SingleOrDefault
是否有用(如果您获得null
,则提供更好的错误消息),但获得2(或更多)肯定是一个大问题。
答案 2 :(得分:1)
LINQ扩展在数据库之外也很有用。一个实际的例子是从给定输入字符串的框架中找到正确的工厂。如果输入字符串与多个工厂匹配,则认为这是错误(或至少需要特殊情况处理)。我还使用LINQ(特别是单个)来构建单元测试。
示例:
try {
IWorkspaceFactory factories[] = {
new SdeFactory(), new FGDBFactory(), new AccessFactory() };
IWorkspace workspace = factories
.Single(wf=>wf.IsWorkspace(input)).Open(input);
workspace.DoSoething();
} catch(OperationException) {
//can't remember the exact exception off the top of my head
//Catch more than one match
}