首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

LINQ 學習筆記:Select 與 SelectMany 完整指南 (投影、索引、子查詢物件層級、延遲執行)

     編輯:關於SqlServer

Select 與 SelectMany 是 LINQ 核心投影運算子,對應 SQL SELECT 與 CROSS/OUTER APPLY (或扁平化連接)。本文系統整理語法、索引投影、子查詢建構物件層級、雙重延遲執行特性。

Select:一對一投影轉換


// 來源:IEnumerable → 目標:IEnumerable
// 元素數量不變,每個元素經選擇器函數轉換

// 1. 基本投影:列出所有字型名稱
var fonts = from f in FontFamily.Families
            select f.Name;

// 2. 匿名型建構多欄位
var q = from f in FontFamily.Families
        select new { 
            f.Name, 
            LineSpacing = f.GetLineSpacing(FontStyle.Bold) 
        };

// 3. 無轉換投影 (僅篩選)
var q = from f in FontFamily.Families
        where f.IsStyleAvailable(FontStyle.Strikeout)
        select f; // 回傳 FontFamily 物件本身

索引投影 (Indexed Select)

選擇器接受第二個參數 int index (元素在序列中位置,**僅限 LINQ to Objects**):


string[] names = { "James", "Derek", "Harry", "Mary", "Jack" };
var q = names.Select((s, i) => i + "=" + s);
// 結果: "0=James", "1=Derek", "2=Harry", "3=Mary", "4=Jack"

SelectMany:一對多扁平化投影

  • 選擇器回傳 IEnumerable (子序列)。
  • 將所有子序列**串連合併**為單一扁平序列。
  • 對應 SQL CROSS APPLY / OUTER APPLY / 非等值連接。

// 範例:建立目錄-檔案兩層物件結構
DirectoryInfo[] dirs = new DirectoryInfo(@"C:\LINQ").GetDirectories();

var q = from d in dirs
        where (d.Attributes & FileAttributes.System) == 0
        select new {
            DirectoryName = d.FullName,
            Created = d.CreationTime,
            Files = from f in d.GetFiles()
                    where (f.Attributes & FileAttributes.Hidden) == 0
                    select new { FileName = f.Name, f.Length }
        };

// q 型別:IEnumerable<匿型別{ DirectoryName, Created, Files }>
// Files 型別:IEnumerable<匿型別{ FileName, Length }>

相關子查詢與物件層級

  • 內層查詢引用外層範圍變數 (d) → **相關子查詢**。
  • 建立**階層式物件圖** (目錄包含檔案集合),而非扁平化。
  • 雙重延遲執行: 外層序列延遲,內層 Files 序列**直到被枚舉時才執行** d.GetFiles()。

Select vs SelectMany 選擇指南

場景運算子結果結構
單一元素轉換/篩選/建構匿名型別Select同基數扁平序列
一對多關聯、子集合展開、扁平化連接SelectMany合併後扁平序列
保留階層結構 (父含子集合屬性)Select + 子查詢巢狀物件圖
LINQ to SQL 連接優先 Join/GroupJoinSQL JOIN 效能最佳
本地集合連接優先 Join/GroupJoin雜湊連接 O(N+M)

LINQ to SQL 特殊限制

  • **不支援索引投影** (s, i) => ... (無法翻譯為 SQL)。
  • 子查詢投影集合屬性 (Files = ...) 可能導致 **N+1 查詢問題** 或客戶端評估,建議改用 Join 或預先載入 (DataLoadOptions.LoadWith)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved