where 子句 (C# 參考)
where
子句用於查詢運算式中,以指定將在查詢運算式中傳回資料來源中的項目。 它會將布林值條件 (predicate) 套用到每個來源項目 (透過範圍變數所參考),並傳回所指定條件為 true 的項目。 單一查詢運算式可能會包含多個 where
子句,而單一子句可能會包含多個述詞子運算式。
範例 1
在下列範例中,where
子句會篩選掉不小於五的所有數字。 如果您移除 where
子句,則會傳回資料來源中的所有數字。 num < 5
運算式是套用至每個項目的述詞。
class WhereSample
{
static void Main()
{
// Simple data source. Arrays support IEnumerable<T>.
int[] numbers = [5, 4, 1, 3, 9, 8, 6, 7, 2, 0];
// Simple query with one predicate in where clause.
var queryLowNums =
from num in numbers
where num < 5
select num;
// Execute the query.
foreach (var s in queryLowNums)
{
Console.Write(s.ToString() + " ");
}
}
}
//Output: 4 1 3 2 0
範例 2
在單一 where
子句內,您可以使用 && 和 || 運算子來指定所需數目的述詞。 在下列範例中,查詢會指定兩個述詞,只選取小於五的偶數。
class WhereSample2
{
static void Main()
{
// Data source.
int[] numbers = [5, 4, 1, 3, 9, 8, 6, 7, 2, 0];
// Create the query with two predicates in where clause.
var queryLowNums2 =
from num in numbers
where num < 5 && num % 2 == 0
select num;
// Execute the query
foreach (var s in queryLowNums2)
{
Console.Write(s.ToString() + " ");
}
Console.WriteLine();
// Create the query with two where clause.
var queryLowNums3 =
from num in numbers
where num < 5
where num % 2 == 0
select num;
// Execute the query
foreach (var s in queryLowNums3)
{
Console.Write(s.ToString() + " ");
}
}
}
// Output:
// 4 2 0
// 4 2 0
範例 3
where
子句可能包含一個或多個傳回布林值的方法。 在下列範例中,where
子句使用方法來判斷範圍變數的目前值是偶數還是奇數。
class WhereSample3
{
static void Main()
{
// Data source
int[] numbers = [5, 4, 1, 3, 9, 8, 6, 7, 2, 0];
// Create the query with a method call in the where clause.
// Note: This won't work in LINQ to SQL unless you have a
// stored procedure that is mapped to a method by this name.
var queryEvenNums =
from num in numbers
where IsEven(num)
select num;
// Execute the query.
foreach (var s in queryEvenNums)
{
Console.Write(s.ToString() + " ");
}
}
// Method may be instance method or static method.
static bool IsEven(int i) => i % 2 == 0;
}
//Output: 4 8 6 2 0
備註
where
子句是篩選機制。 它幾乎可以放在查詢運算式中的任何位置,但不能是第一個或最後一個子句。 where
子句可能出現在 group 子句之前或之後,取決於必須在分組來源項目之前還是之後進行篩選。
如果指定的述詞不適用於資料來源中的項目,則會產生編譯時期錯誤。 這是 LINQ 所提供的強類型檢查的其中一個優點。
在編譯時間,where
關鍵字會轉換為 Where 標準查詢運算子方法呼叫。