2009-08-11 64 views
3

我已閱讀過有關此運算符的一本書,但是因爲我沒有使用過多的數據庫,所以我想不出任何想要獲得單個項目的circunstance。我的意思是,我可以有一組條件,但是我會使用First或Last,而不是Single。有什麼不同?讓它只返回一個項目,並在沒有結果或多個結果的情況下拋出異常,這有什麼意義?唯一出現在我腦海中的就是確保只有一件物品。LINQ-單一運算符

謝謝!

回答

6

這正是您爲什麼要這樣做的原因。有時,結果集中有多個項目表示某處存在錯誤,如果情況並非如此,您希望拋出異常。

+0

啊,所以這是唯一的情況下你想要的? – 2009-08-11 07:22:52

6

這裏最典型的例子是,當你有一個id(所以希望存在的數據,獨特的,由ID):

var item = ctx.SomeTable.Single(x=>x.Id == id); 

你可以檢查SingleOrDefault如果有用的話(以提供更好的錯誤信息如果你得到一個null),但獲得2(或更多)絕對是一個大問題。

+0

+1個很好的例子。 – 2009-08-11 14:43:02

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 
    }