1. 程式人生 > >LINQ標準查詢操作符(一)——select、SelectMany、Where、OrderBy、OrderByDescending、ThenBy、ThenByDescending和Reverse

LINQ標準查詢操作符(一)——select、SelectMany、Where、OrderBy、OrderByDescending、ThenBy、ThenByDescending和Reverse

extent art 相同 開始 ima 方法 降序排序 ext extension

一、投影操作符

1. Select

Select操作符對單個序列或集合中的值進行投影。下面的示例中使用select從序列中返回Employee表的所有列:

技術分享圖片
    //查詢語法
    var query =
        from e in db.Employees
        where e.FirstName.StartsWith("M")
        select e;

生成的sql:
SELECT
[Extent1].[EmployeeID] AS [EmployeeID],
[Extent1].[LastName] AS [LastName],
[Extent1].[FirstName] AS [FirstName],
[Extent1].[Title] AS [Title],
[Extent1].[TitleOfCourtesy] AS [TitleOfCourtesy],
[Extent1].[BirthDate] AS [BirthDate],
[Extent1].[HireDate] AS [HireDate],
[Extent1].[Address] AS [Address],
[Extent1].[City] AS [City],
[Extent1].[Region] AS [Region],
[Extent1].[PostalCode] AS [PostalCode],
[Extent1].[Country] AS [Country],
[Extent1].[HomePhone] AS [HomePhone],
[Extent1].[Extension] AS [Extension],
[Extent1].[Photo] AS [Photo],
[Extent1].[Notes] AS [Notes],
[Extent1].[ReportsTo] AS [ReportsTo],
[Extent1].[PhotoPath] AS [PhotoPath]
FROM [dbo].[Employees] AS [Extent1]
WHERE [Extent1].[FirstName] LIKE N‘M%‘
技術分享圖片

技術分享圖片
//方法語法
    var q =
        db.Employees
        .Where(e => e.FirstName.StartsWith("M"))
        .Select(e => e);

生成的sql:
SELECT
[Extent1].[EmployeeID] AS [EmployeeID],
[Extent1].[LastName] AS [LastName],
[Extent1].[FirstName] AS [FirstName],
[Extent1].[Title] AS [Title],
[Extent1].[TitleOfCourtesy] AS [TitleOfCourtesy],
[Extent1].[BirthDate] AS [BirthDate],
[Extent1].[HireDate] AS [HireDate],
[Extent1].[Address] AS [Address],
[Extent1].[City] AS [City],
[Extent1].[Region] AS [Region],
[Extent1].[PostalCode] AS [PostalCode],
[Extent1].[Country] AS [Country],
[Extent1].[HomePhone] AS [HomePhone],
[Extent1].[Extension] AS [Extension],
[Extent1].[Photo] AS [Photo],
[Extent1].[Notes] AS [Notes],
[Extent1].[ReportsTo] AS [ReportsTo],
[Extent1].[PhotoPath] AS [PhotoPath]
FROM [dbo].[Employees] AS [Extent1]
WHERE [Extent1].[FirstName] LIKE N‘M%‘
技術分享圖片 技術分享圖片
可以簡寫為:

var qq =
                    db.Employees
                    .Where(e => e.FirstName.StartsWith("M"))
                    .ToList();
技術分享圖片

=========================================================

當然,你也可以返回單個列,例如:

技術分享圖片
            var query =
from e in db.Employees
where e.FirstName.StartsWith("M")
select e.FirstName;
var query1 =
db.Employees.Where(e => e.FirstName.StartsWith("M"))
.Select(e => e.FirstName);

生成的sql:
SELECT
[Extent1].[FirstName] AS [FirstName]
FROM [dbo].[Employees] AS [Extent1]
WHERE [Extent1].[FirstName] LIKE N‘M%‘
技術分享圖片

如果像上面這樣,只查詢單列,則返回類似於無名稱的數組,並不能用於生成Json。
技術分享圖片

如果想返回單列匿名類,應

            var query1 =
                    db.Employees.Where(e => e.FirstName.StartsWith("M"))
                    .Select(e => new { e.FirstName })
                    .ToList();

返回結果為:
技術分享圖片

==========================================================

你也可以返回序列中的某幾列,例如:

技術分享圖片
            var query =
                (from e in db.Employees
                 where e.FirstName.StartsWith("M")
                 select new
                 {
                     e.FirstName,
                     e.LastName,
                     e.Title
                 }).ToList();
            var query1 =
                db.Employees.Where(e => e.FirstName.StartsWith("M"))
                .Select(e => new
                {
                    e.FirstName,
                    e.LastName,
                    e.Title
                })
                .ToList();
生成的sql:
SELECT
1 AS [C1],
[Extent1].[FirstName] AS [FirstName],
[Extent1].[LastName] AS [LastName],
[Extent1].[Title] AS [Title]
FROM [dbo].[Employees] AS [Extent1]
WHERE [Extent1].[FirstName] LIKE N‘M%‘
技術分享圖片

查詢多列,返回的是一個匿名類

技術分享圖片

2. SelectMany

SelectMany操作符提供了將多個from子句組合起來的功能,它將每個對象的結果合並成單個序列。下面是一個示例:

技術分享圖片
            var query =
                (from e in db.Employees
                 from o in e.Orders
                 select o).ToList();
            //方法語法
            var q =
                db.Employees
                .SelectMany(e => e.Orders)
                .ToList();
生成的sql:
SELECT 
    [Extent1].[OrderID] AS [OrderID], 
    [Extent1].[CustomerID] AS [CustomerID], 
    [Extent1].[EmployeeID] AS [EmployeeID], 
    [Extent1].[OrderDate] AS [OrderDate], 
    [Extent1].[RequiredDate] AS [RequiredDate], 
    [Extent1].[ShippedDate] AS [ShippedDate], 
    [Extent1].[ShipVia] AS [ShipVia], 
    [Extent1].[Freight] AS [Freight], 
    [Extent1].[ShipName] AS [ShipName], 
    [Extent1].[ShipAddress] AS [ShipAddress], 
    [Extent1].[ShipCity] AS [ShipCity], 
    [Extent1].[ShipRegion] AS [ShipRegion], 
    [Extent1].[ShipPostalCode] AS [ShipPostalCode], 
    [Extent1].[ShipCountry] AS [ShipCountry]
    FROM [dbo].[Orders] AS [Extent1]
    WHERE [Extent1].[EmployeeID] IS NOT NULL
技術分享圖片

技術分享圖片

場景:Employee與Order為0或1對多的關系,也就是Order的EmployeeID可以為null

從生成的sql語句也可以看到,只查詢出了Order的EmployeeID不為null的所有Order記錄。

二、限制操作符

Where是限制操作符,它將過濾標準應用在序列上,按照提供的邏輯對序列中的數據進行過濾。

Where操作符不啟動查詢的執行。當開始對序列進行遍歷時查詢才開始執行,此時過濾條件將被應用到查詢中。Where操作符的使用方法已經在第一節中出現過,這裏不再冗述。

三、排序操作符

排序操作符,包括OrderBy、OrderByDescending、ThenBy、ThenByDescending和Reverse,提供了升序或者降序排序。

1. OrderBy

OrderBy操作符將序列中的元素按照升序排列。下面的示例演示了這一點:

技術分享圖片
            //查詢語法
            var query =
                (from e in db.Employees
                 orderby e.FirstName
                 select e).ToList();
            //方法語法
            var q =
                db.Employees
                .OrderBy(e => e.FirstName)
                .ToList();
生成的sql:
SELECT 
    [Extent1].[EmployeeID] AS [EmployeeID], 
    [Extent1].[LastName] AS [LastName], 
    [Extent1].[FirstName] AS [FirstName], 
    [Extent1].[Title] AS [Title], 
    [Extent1].[TitleOfCourtesy] AS [TitleOfCourtesy], 
    [Extent1].[BirthDate] AS [BirthDate], 
    [Extent1].[HireDate] AS [HireDate], 
    [Extent1].[Address] AS [Address], 
    [Extent1].[City] AS [City], 
    [Extent1].[Region] AS [Region], 
    [Extent1].[PostalCode] AS [PostalCode], 
    [Extent1].[Country] AS [Country], 
    [Extent1].[HomePhone] AS [HomePhone], 
    [Extent1].[Extension] AS [Extension], 
    [Extent1].[Photo] AS [Photo], 
    [Extent1].[Notes] AS [Notes], 
    [Extent1].[ReportsTo] AS [ReportsTo], 
    [Extent1].[PhotoPath] AS [PhotoPath]
    FROM [dbo].[Employees] AS [Extent1]
    ORDER BY [Extent1].[FirstName] ASC
技術分享圖片

因為未使用Select,所以返回的為動態包裝類。
這裏可以使用OrderBy的重載方法OrderBy(Func<T,TKey>,IComparer<Tkey>)來指定序列的排序方式。

2. OrderByDescending

OrderByDescending操作符將序列中的元素按照降序排列。用法與OrderBy相同,這裏不再演示。

3. ThenBy

ThenBy操作符實現按照次關鍵字對序列進行升序排列。此操作符的查詢語法與方法語法略有不同,以下代碼演示了這一點:

技術分享圖片
            //查詢語法
            var query =
                (from e in db.Employees
                 orderby e.FirstName, e.LastName
                 select e).ToList();
            //方法語法
            var q =
                db.Employees
                .OrderBy(e => e.FirstName)
                .ThenBy(e => e.LastName)
                .ToList();

生成的sql:
SELECT 
    [Extent1].[EmployeeID] AS [EmployeeID], 
    [Extent1].[LastName] AS [LastName], 
    [Extent1].[FirstName] AS [FirstName], 
    [Extent1].[Title] AS [Title], 
    [Extent1].[TitleOfCourtesy] AS [TitleOfCourtesy], 
    [Extent1].[BirthDate] AS [BirthDate], 
    [Extent1].[HireDate] AS [HireDate], 
    [Extent1].[Address] AS [Address], 
    [Extent1].[City] AS [City], 
    [Extent1].[Region] AS [Region], 
    [Extent1].[PostalCode] AS [PostalCode], 
    [Extent1].[Country] AS [Country], 
    [Extent1].[HomePhone] AS [HomePhone], 
    [Extent1].[Extension] AS [Extension], 
    [Extent1].[Photo] AS [Photo], 
    [Extent1].[Notes] AS [Notes], 
    [Extent1].[ReportsTo] AS [ReportsTo], 
    [Extent1].[PhotoPath] AS [PhotoPath]
    FROM [dbo].[Employees] AS [Extent1]
    ORDER BY [Extent1].[FirstName] ASC, [Extent1].[LastName] ASC
技術分享圖片

4. ThenByDescending

ThenByDescending操作符實現按照次關鍵字對序列進行降序排列。此操作符的查詢語法與方法語法略有不同,以下代碼演示了這一點:

技術分享圖片
    //查詢語法
    var query =
        from e in db.Employees
        orderby e.FirstName,e.LastName descending
        select e;
    //方法語法
    var q =
        db.Employees
        .OrderBy(e => e.FirstName)
        .ThenByDescending(e => e.LastName)
        .Select(e => e);
    foreach (var item in query)
    {
        Console.WriteLine(item.FirstName);
    }

    生成的sql:

SELECT
[Extent1].[EmployeeID] AS [EmployeeID],
[Extent1].[LastName] AS [LastName],
[Extent1].[FirstName] AS [FirstName],
[Extent1].[Title] AS [Title],
[Extent1].[TitleOfCourtesy] AS [TitleOfCourtesy],
[Extent1].[BirthDate] AS [BirthDate],
[Extent1].[HireDate] AS [HireDate],
[Extent1].[Address] AS [Address],
[Extent1].[City] AS [City],
[Extent1].[Region] AS [Region],
[Extent1].[PostalCode] AS [PostalCode],
[Extent1].[Country] AS [Country],
[Extent1].[HomePhone] AS [HomePhone],
[Extent1].[Extension] AS [Extension],
[Extent1].[Photo] AS [Photo],
[Extent1].[Notes] AS [Notes],
[Extent1].[ReportsTo] AS [ReportsTo],
[Extent1].[PhotoPath] AS [PhotoPath]
FROM [dbo].[Employees] AS [Extent1]
ORDER BY [Extent1].[FirstName] ASC, [Extent1].[LastName] DESC
技術分享圖片

5. Reverse

Reverse將會把序列中的元素按照從後到前的循序反轉。需要註意的是,Reverse方法的返回值是void,以下代碼演示了這一點

技術分享圖片
            //方法語法
            var q =
                db.Employees
                .Select(e => e.FirstName)
                .ToList();
            q.Reverse();
技術分享圖片

LINQ標準查詢操作符(一)——select、SelectMany、Where、OrderBy、OrderByDescending、ThenBy、ThenByDescending和Reverse