2011-06-21 10 views
2

Linqで私がSingleOrDefaultまたはFirstOrDefaultを呼び出すと、特定のオブジェクトに対してnull以外の何かを返すのですか?デフォルト(TSource)を作る方法

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

CrazyControlsに、ベースのRender()メソッドを実装するデフォルトのインスタンスを返すようにするにはどうすればよいですか?

+1

コードスニペットが奇妙です。あなたは "All" CrazyControlsを要求していますが、次の行では「例外を投げるには複数のコントロールがあります」と言っています。 – dlev

+0

ええ...ちょっと変わったけど、合法です。私はそれを爆破したいより多くの場合は、与えられたIDを持つCrazyControlが1つだけでなければなりません。 – Peter

答えて

7

DefaultIfEmpty(defaultValue)となります。これにより、コレクションが空の場合は、型のデフォルトインスタンスが設定されます。

だから、あなたが行うことができます:

var defaultValue = new CrazyControl(...); 

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

ビットを変更するために必要なクエリ式。新しいものは次のように動作します。

  1. 既存の基準に従ってコレクションをフィルタリングします。これにより、フィルタリングされたシーケンス内に1つまたは複数の項目が残されます。
  2. DefaultIfEmptyを使用して、シーケンスに正確に1つのアイテムが含まれていることを確認します(既に1つがある場合は、何もしません)。
  3. Firstを使用して1つのアイテムを取得します。私がSingleを最初の代わりに使用しなかった理由は、述語が異なっている(または将来変更される)場合、複数の項目を受け入れるため、Singleがスローされます。

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

    つまり、あなたがdefault valueを定義する必要があります。要素がない場合

3

はあなたが戻りたい、この `何か」を定義する必要があります。

関連する問題