我已閱讀過有關此運算符的一本書,但是因爲我沒有使用過多的數據庫,所以我想不出任何想要獲得單個項目的circunstance。我的意思是,我可以有一組條件,但是我會使用First或Last,而不是Single。有什麼不同?讓它只返回一個項目,並在沒有結果或多個結果的情況下拋出異常,這有什麼意義?唯一出現在我腦海中的就是確保只有一件物品。LINQ-單一運算符
謝謝!
我已閱讀過有關此運算符的一本書,但是因爲我沒有使用過多的數據庫,所以我想不出任何想要獲得單個項目的circunstance。我的意思是,我可以有一組條件,但是我會使用First或Last,而不是Single。有什麼不同?讓它只返回一個項目,並在沒有結果或多個結果的情況下拋出異常,這有什麼意義?唯一出現在我腦海中的就是確保只有一件物品。LINQ-單一運算符
謝謝!
這正是您爲什麼要這樣做的原因。有時,結果集中有多個項目表示某處存在錯誤,如果情況並非如此,您希望拋出異常。
這裏最典型的例子是,當你有一個id(所以希望存在的數據,獨特的,由ID):
var item = ctx.SomeTable.Single(x=>x.Id == id);
你可以檢查SingleOrDefault
如果有用的話(以提供更好的錯誤信息如果你得到一個null
),但獲得2(或更多)絕對是一個大問題。
+1個很好的例子。 – 2009-08-11 14:43:02
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
}
啊,所以這是唯一的情況下你想要的? – 2009-08-11 07:22:52