首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

LINQ to SQL 投影查詢精講:Select 九大形式與 Distinct 去重

     編輯:關於.NET

Select 核心特性

  • 位於查詢表達式末尾,返回結果集
  • **延遲執行**:聲明時不查詢,枚舉時才觸發
  • 可用 ToList()/ToArray() 緩存結果

九大 Select 形式

1. 簡單投影

var q = from c in db.Customers
        select c.ContactName;

2. 匿名類型 (C# 3.0 特性)

// 多字段
select new { c.ContactName, c.Phone };

// 字段重命名 + 運算
select new {
    Name = e.FirstName + " " + e.LastName,
    Phone = e.HomePhone
};

// 計算字段
select new {
    p.ProductID,
    HalfPrice = p.UnitPrice / 2
};

編譯器自動生成匿名類,屬性名可自定義。

3. 條件投影 (三元運算符 → CASE WHEN)

select new {
    p.ProductName,
    Availability = p.UnitsInStock - p.UnitsOnOrder < 0 ? "Out Of Stock" : "In Stock"
};

4. 指定強類型

select new Name {
    FirstName = e.FirstName,
    LastName = e.LastName
};

5. 篩選結合 (Where + Select)

from c in db.Customers
where c.City == "London"
select c.ContactName;

6. 整形類型

select new {
    c.CustomerID,
    CompanyInfo = new { c.CompanyName, c.City, c.Country },
    ContactInfo = new { c.ContactName, c.ContactTitle }
};

7. 嵌套集合

from o in db.Orders
select new {
    o.OrderID,
    DiscountedProducts = from od in o.OrderDetails
                         where od.Discount > 0
                         select od,
    FreeShippingDiscount = o.Freight
};

8. 本地方法調用 (僅 LINQ to Objects / 本地執行)

var q = from c in db.Customers
        where c.Country == "UK" || c.Country == "USA"
        select new {
            c.CustomerID,
            c.CompanyName,
            Phone = c.Phone,
            InternationalPhone = PhoneNumberConverter(c.Country, c.Phone)
        };

⚠️ **LINQ to SQL 無法將本地方法翻譯為 SQL**,需先 ToList() 拉取到內存再調用。

9. Distinct 去重

var q = (from c in db.Customers
         select c.City).Distinct();

生成 SQL:SELECT DISTINCT [City] FROM [Customers]。

匿名類型進階技巧

  • var d = new { Name = "s" } ✓ 屬性名顯式
  • var d = new { "s" } ✗ 編譯錯誤 (無屬性名)
  • string c = "d"; var d = new { c } ✓ 隱式屬性名 = 變量名
  • 投影時可重命名:new { Phone = c.HomePhone }

延遲執行陷阱

var q = db.Customers.Select(c => c.City); // 未執行
var list = q.ToList(); // 此處執行 SQL
var arr = q.ToArray(); // 再次執行 SQL!

需緩存結果避免重複查詢。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved