1. 程式人生 > >LINQ to Entities 查詢中的標準查詢運算子

LINQ to Entities 查詢中的標準查詢運算子

投影和篩選方法

投影指的是轉換的結果集到所需的窗體中的元素。 例如,可以從結果集中的每個物件投影所需的屬性子集,可以投影一個屬性並對其執行數學計算,也可以從結果集投影整個物件。 投影方法有 Select 和 SelectMany

篩選指限制結果集包含與指定的條件匹配的元素的操作。 篩選方法為 Where

LINQ to Entities 中支援大多數投影和篩選方法的過載,除了那些接受位置引數的方法。

聯接方法

在面向相互之間沒有可導航關係的資料來源的查詢中,聯接是一項重要的操作。 聯接兩個資料來源就是將一個數據源中的物件與另一個數據源中具有相同屬性的物件相關聯。 聯接方法有 Join

 和 GroupJoin

大多數聯接方法的過載都受支援,除了使用 IEqualityComparer<T> 的方法。 這是因為比較器不能轉換為資料來源。

集方法

LINQ 中的集運算是根據包含或不包含本集合或其他集合(或集)中的等價元素,對其結果集執行查詢運算。 集方法有 AllAnyConcatContainsDefaultIfEmptyDistinctEqualAllExceptIntersect 和 Union

LINQ to Entities 中支援大多數集方法的過載,只是與 LINQ to Objects 在行為上有所不同。 但是,並不支援使用 

IEqualityComparer<T> 的集方法,原因是比較器不能轉換為資料來源。

排序方法

排序是指基於一個或多個屬性對結果集中的元素排序。 指定多個排序條件可在組中消除並列。

大多數排序方法的過載都受支援,除了使用 IComparer<T> 的方法。 這是因為比較器不能轉換為資料來源。排序方法有 OrderByOrderByDescendingThenByThenByDescending 和 Reverse

由於查詢在資料來源上執行,因此排序行為與在 CLR 中執行的查詢可能有所不同。 這是因為可以在資料來源中設定諸如區分大小寫排序、日本文字排序和 null 值排序等排序選項。 根據資料來源的不同,這些排序選項可能會產生與 CLR 中不同的結果。

如果在多個排序操作中指定相同的關鍵字選擇器,則會產生重複排序。 此舉無效並將引發異常。

分組方法

分組是指將資料分到不同的組,使每組中的元素擁有公共的屬性。 分組方法為 GroupBy

大多數分組方法的過載都受支援,除了使用 IEqualityComparer<T> 的方法。 這是因為比較器不能轉換為資料來源。

分組方法使用對關鍵字選擇器的不同子查詢對映到資料來源。 關鍵字選擇器比較子查詢使用資料來源的語義執行,其中包括與比較 null 值相關的問題。

聚合方法

聚合運算從值的集合中計算出單個值。 例如,從一個月累計的每日溫度值計算出日溫度平均值就是一個聚合運算。 聚合方法有 AggregateAverageCountLongCountMaxMin 和 Sum

大多數聚合方法的過載都受支援。 對於與 null 值有關的行為,聚合方法使用資料來源語義。 根據使用的後端資料來源的不同,聚合方法在涉及 null 值時的行為也可能會有所不同。 使用資料來源語義的聚合方法行為與 CLR 方法的預期行為也可能有所不同。 例如,SQL Server 上的 Sum 方法的預設行為是忽略所有 null 值,而不是引發異常。

聚合導致的任何異常(如 Sum 函式的溢位)都會在查詢結果具體化的過程中作為資料來源異常或實體框架異常引發。

對於涉及序列計算的方法,如 Sum 和 Average,真正的計算將在伺服器上執行。 因此,伺服器上可能發生型別轉換和精度損失,其結果與使用 CLR 語義預期得出的結果可能有所不同。

下表顯示了聚合方法對 null 值和非 null 值的預設行為:

方法 無資料 全部 null 值 部分 null 值 無 null 值
Average 返回 Null。 返回 Null。 返回序列中非 null 值的平均值。 計算數值序列的平均值。
Count 返回 0 返回序列中 null 值的個數。 返回序列中的 null 值和非 null 值個數。 返回序列中的元素數。
Max 返回 Null。 返回 Null。 返回序列中非 null 值的最大值。 返回序列中的最大值。
Min 返回 Null。 返回 Null。 返回序列中非 null 值的最小值。 返回序列中的最小值。
Sum 返回 Null。 返回 Null。 返回序列中非 null 值的和。 計算數值序列的和。

型別方法

在 Entity Framework 上下文中支援處理型別轉換和測試的兩個 LINQ 方法。 這就意味著僅支援對映到相應 Entity Framework 型別的型別。 有關這些型別的列表,請參閱概念模型型別 (CSDL)。 型別方法有 Convert 和 OfType

對於實體型別支援 OfType。 對概念模型基元型別支援 Convert。 還支援 C# 的 is 和 as 方法。

分頁方法

分頁操作從序列中返回單個元素或多個元素。 支援的分頁方法為First, FirstOrDefault, Single, SingleOrDefault, Skip,並Take

大量的分頁方法不支援,原因可能是不能將函式對映到資料來源或缺乏隱式排序資料來源上的集。 返回預設值的方法僅限於預設值為 null 的概念模型基元型別和引用型別。 對空序列執行的分頁方法將返回 null。