2017-01-06 10 views
3

私は2つのLINQクエリを持っていますが、私が期待しているものを返すものと、もう一方はそうでないものです。なぜそれを理解しようとしています。 Configのすべてのノードから「TEST」という名前のノードがあり、そのSelected属性がTrueであるかどうかを調べようとしています。これらの2つのLINQクエリの違いは何ですか?

クエリ1 - 正しいことを返す)(いずれも内部の条件があります。失敗した

var res1 = 
(from config in _config.CurrentSettings.Config let name = config.name select config).Any(
    config => config.name.Equals("TEST") && config.selected == true); 

クエリ2は、選択内部の状態を持っています

(_config.CurrentSettings.Config.Select(config => config.name.Equals("TEST") && config.selected)) 
.Any(); 
+1

'Select'は' IEnumerable 'を返します。入力シーケンスをフィルタリングするには' Where'を使う必要があります。 – Lee

+0

'let name = config.name'は何をしていますか?その役に立たずに –

+1

いずれかが返され、bolleanが返され、Selectがデータを返す –

答えて

5

LINQのAny()なしで条件は「少なくとも1つの行を有する」ことを意味する。最初のクエリは条件を指定し、「少なくとも1つの行が条件に一致する」ようにします。

2番目のクエリを最初のクエリと同等にするには、Any(flag => flag)を使用するか、SelectWhereに置き換えます。これらのオプションは両方とも、最初のAnyよりも劣ります。

1

ここではすべてが役に立たない。

(from config in _config.CurrentSettings.Config let name = config.name select config) 

あなたは、コードのあなたの最初のブロックと同じように実行します。この

_config.CurrentSettings.Config.Any(config => config.name.Equals("TEST") && config.selected == true); 

にそれを絞り込むことができます。

Selectメソッドは、セレクタ を使用して、ienumerableを別のフォームに変換します。 パラメータなしAnyは、シーケンスに要素が含まれている場合はtrueを返します。それ以外の場合はfalseを返します。

1

あなたは試してみたいことがあります。

var isTestSelected = _config.CurrentSettings.Config.Any(config => config.name.Equals("TEST") && config.selected); 

SelectAny方法のドキュメントを見ると、いくつかの洞察を提供することができます。

これらのリンクの[Parameters]セクションを見ると、どちらの方法もFuncを受け入れていますが、その使用方法は実際とは異なります。

任意

述語 型:条件を各 要素をテストするSystem.Func<TSource, Boolean>機能。

を選択

セレクタ タイプ:System.Func<TSource, TResult> Aは各要素に適用されます に変換関数を。(使用されていない)ローカル名を宣言し、あなたのコレクション内の各項目に

だから、あなたのQuery1を例に、あなたは変換(またはマップ)を適用している変数 let name = config.name、その後、ちょうど戻ってオブジェクトはそのままです(何も実際に変換することなく)select config。このコードは余分であり、削除することができます。

Any()ラムダは、ラムダ述語と一致しない項目をフィルタリングすることによって、Query1ですべての作業を行っています。

Query2では、フィルタリングラムダを変換関数に渡してから、フィルタなしでフィルタリング関数を使用します。

Linqを使用して目的の結果を得るには、さまざまな方法があります。私はフレームワーク(link)によって提供される異なるマッピング(セレクタ)とフィルタリング(述語)関数を調べることをお勧めします。

関連する問題