簡體   English   中英

這兩個LINQ查詢有什么區別?

[英]What is the difference between these 2 LINQ queries?

我有2個LINQ查詢,一個返回我期望的,另一個沒有,我試圖理解為什么。 我試圖找出是否從Config中的所有節點,是否有一個名為“TEST”的節點,其Selected屬性為True。

查詢1 - 返回正確的東西的條件是Any():

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

失敗的查詢2具有Select中的條件:

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

LINQ的Any()沒有條件意味着“至少有一行”。 第一個查詢指定一個條件,使其“至少有一行符合條件”。

要使第二個查詢等效於第一個查詢,請使用Any(flag => flag) ,或將Select替換為Where 這兩個選項都不如初始的Any ,條件在里面,因為它們不具有可讀性。

這整件事都沒用。

(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方法使用您提供的選擇器將不可數據轉換為另一個表單。 無參數的Any如果序列中包含的任何元素返回true。 否則返回false。

你可能想嘗試:

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

查看SelectAny方法的文檔,可能會提供一些見解。

如果查看每個鏈接的“參數”部分,您會看到雖然兩個方法都接受Func ,但它們的用法實際上是不同的。

任何

predicate類型: System.Func<TSource, Boolean>用於測試條件的每個元素的函數。

選擇

selector類型: System.Func<TSource, TResult>要應用於每個元素的轉換函數。

因此,在Query1示例中,您將一個轉換(或映射)應用於集合中的每個項目,它聲明一個本地名稱變量let name = config.name (未使用),然后只返回該對象原樣(沒有實際轉換任何東西) select config 這段代碼是多余的,可以刪除。

你的Any() lambda通過過濾與lambda謂詞不匹配的項來完成Query1中的所有工作。

在Query2中,您將過濾lambda傳遞給變換函數,然后使用不帶過濾器的過濾函數。

使用Linq有許多不同的方法可以獲得所需的結果。 我鼓勵您查看框架( 鏈接 )提供的不同映射(選擇器)和過濾(謂詞)函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM