2011-06-21 58 views
2

在Linq當我打電話給SingleOrDefault或FirstOrDefault時,如何爲特定對象返回非null值,例如。如何使默認(TSource)

 List<CrazyControls> cc = CrazyControlRepository.All(); 
     cc.SingleOrDefault(p => p.Id == id).Render(); 

如何讓我的CrazyControls返回實現基本render()方法的默認實例?

+1

該代碼片段很奇怪。你在問「所有」CrazyControls,然後在下一行中你說「拋出一個異常是有多個控件。」 – dlev

+0

是啊......這有點奇怪但合法。如果有更多我想讓它爆炸的應該只有一個給定ID的CrazyControl。 – Peter

回答

7

With DefaultIfEmpty(defaultValue)。這將確保如果集合爲空,則將使用該類型的默認實例進行填充。

所以,你可以這樣做:

var defaultValue = new CrazyControl(...); 

List<CrazyControls> cc = CrazyControlRepository.All(); 
cc.Where(p => p.Id == id).DefaultIfEmpty(defaultValue).First().Render(); 

需要改變一點查詢表達式。新的工作是這樣的:

  1. 根據現有的標準過濾集合。這會在過濾的序列中留下一個或沒有項目。
  2. 使用DefaultIfEmpty來確保序列只包含一個項目(如果它已經有一個,DefaultIfEmpty什麼都不會做)。
  3. 使用First可以獲得單個項目。我沒有使用Single而不是第一個的原因是,如果謂詞不同(或未來會發生變化)並且接受多個項目,則會拋出Single
3

您需要定義要回到這個'東西」,如果沒有元素:

(cc.SingleOrDefault(p => p.Id == id) ?? new CrazyControls()).Render(); 

換句話說,你需要定義default value