2016-04-04 21 views
-1

私は、その後のコードがあります。まず列挙スローの「シーケンスに要素が含まれていない」

if (myList.Where (.. condition ..).Where (.. another condition ..).Any()) 
{ 
    var element = myList.Where (.. condition ..).Where (.. another condition ..).First().Elements ; 

    ..some logic over element .. 
} 

を私は例外IF文の内部の最初の行に「シーケンスに要素が含まれていない」を得ます。

myListはで、MyObjectはフォームExpandoObjectを継承し、Elementsと呼ばれるゲッターを持ち、動的にキャストされたオブジェクトを返します。

私が最初と最後の両方で実行されたクエリの詳細を取得しようとしました。

myList.Where (x => x.Child.Name.Equal ("Name").Where (x => x.Elements.Value == myValue) 
+2

[mcve]を表示してください。他のものとは別に、条件が2行で同じか、データソースが安定しているかどうかはわかりません。 (一般的に、私はこの種の二重評価を避けるよう勧めます...) –

+2

あなたはどんな説明をしていますか?フィルタを満たす項目はありません。なぜFirstOrDefaultを実行するのではなく、 'Any' +' First'をやっているのですか? – Luaan

+1

サイドノート。なぜsequence.Any(条件)の代わりに 'sequence.Where(条件).Any()'を書くのですか? – Dennis

答えて

2

問題は何もFirst()への呼び出し前に、あなたのwhere条件(複数可)と一致しないということです。これはwhereを複製しないという利点を持っている

var thing = myList.Where (.. condition ..).Where (.. another condition ..).FirstOrDefault(); 

if (thing != null) 
{ 
    var element = thing.Element; 
    ..some logic over element .. 
} 

:あなたは実際のコードを示していないことを考えると、それは条件が同じであるが、最善のアプローチは、このようにそれを再書き込みするためにであるかどうかを伝えることは困難です条件を2回指定して、入力ソースの二重列挙を保存します。myListが実際に何であるかに応じて、パフォーマンスペナルティが発生する可能性があります。

0

はこのような何かを試してみてください:

var myValue = myList.Where(..condition..).Where(..another condition..).FirstOrDefault(); 
if (myValue != null) 
{ 
    var element = myValue.Elements ; 
    ..some logic over element .. 
} 

あなたは結果がない場合は、ヌルを取得し、ヌルに対するチェックではなく、二回のクエリを実行しているという事実を使用しています。また、クエリを変更する必要がある場合は、変更する場所が1つしかありません。

私はあなたのエラーが.Any()でわずかに異なること、先行する述語とあなたがFirstOrDefault()を使用する必要が.First()

0

によって引き起こされたことを想像してみてください。

var element= myList.FirstOrDefault(x => condition1 && condition2 && ...); 

if(element!= null) 
{ 
    // Apply logic over the element 
} 
関連する問題