C# Linq 左關聯查詢詳解與實踐

在 C# 開發中,Linq(Language Integrated Query)提供了強大的數據查詢能力,尤其是在處理集合間的關聯操作時。本文將詳細解析 C# Linq 中的左關聯查詢,并通過實際案例說明其用法。

左關聯查詢基礎

左關聯(Left Join)是 SQL 中的一種關聯查詢方式,它會返回左表中的所有記錄,無論右表中是否有匹配記錄。在 Linq 中實現左關聯需要使用GroupJoinDefaultIfEmpty方法組合,或者使用查詢語法中的intoDefaultIfEmpty關鍵字。

基本語法結構

csharp

var query = from left in leftTablejoin right in rightTableon left.Key equals right.Key into tempGroupfrom temp in tempGroup.DefaultIfEmpty()select new {LeftProp = left.Property,RightProp = temp?.Property};

這里的關鍵點是:

  1. 使用into關鍵字將右表分組到臨時集合
  2. 使用DefaultIfEmpty()處理可能為空的情況
  3. 在結果選擇器中使用空條件運算符?.處理可能的 null 值
實際案例分析

讓我們通過一個實際案例來理解左關聯的應用場景。假設我們有一個企業資產管理系統,需要查詢特定日期范圍內有資產檢查記錄的企業,并標記哪些企業有記錄。

以下是完整的示例代碼:

csharp

using System;
using System.Collections.Generic;
using System.Linq;namespace LinqLeftJoinDemo
{// 企業信息類public class Enterprise{public string Code { get; set; }public string Name { get; set; }public string Industry { get; set; }}// 資產檢查記錄類public class AssetCheckRecord{public string EnterpriseID { get; set; }public DateTime StartDate { get; set; }public DateTime EndDate { get; set; }public string MonthEndType { get; set; }public decimal CheckScore { get; set; }}// 資產類型枚舉public enum PigAssets{FixedAssets,CurrentAssets,IntangibleAssets}class Program{static void Main(string[] args){// 模擬企業數據var enterprises = new List<Enterprise>{new Enterprise { Code = "E001", Name = "ABC公司", Industry = "制造業" },new Enterprise { Code = "E002", Name = "XYZ公司", Industry = "零售業" },new Enterprise { Code = "E003", Name = "123公司", Industry = "服務業" },new Enterprise { Code = "E004", Name = "TEST公司", Industry = "科技業" }};// 模擬資產檢查記錄數據var checkRecords = new List<AssetCheckRecord>{new AssetCheckRecord{EnterpriseID = "E001",StartDate = new DateTime(2023, 10, 1),EndDate = new DateTime(2023, 10, 31),MonthEndType = PigAssets.FixedAssets.ToString(),CheckScore = 95.5m},new AssetCheckRecord{EnterpriseID = "E003",StartDate = new DateTime(2023, 10, 1),EndDate = new DateTime(2023, 10, 31),MonthEndType = PigAssets.FixedAssets.ToString(),CheckScore = 88.0m}};// 查詢條件DateTime startDate = new DateTime(2023, 10, 1);DateTime endDate = new DateTime(2023, 10, 31);string assetType = PigAssets.FixedAssets.ToString();// 第一步:篩選符合條件的檢查記錄var filteredRecords = checkRecords.Where(r => r.StartDate.Date == startDate.Date&& r.EndDate.Date == endDate.Date&& r.MonthEndType.Equals(assetType)).ToList();// 第二步:執行左關聯查詢var result = from e in enterprisesjoin r in filteredRecordson e.Code equals r.EnterpriseID into enterpriseGroupfrom g in enterpriseGroup.DefaultIfEmpty()select new{EnterpriseID = e.Code,Name = e.Name,HasCheckRecord = g != null,CheckScore = g?.CheckScore ?? 0};// 輸出結果Console.WriteLine("企業資產檢查記錄查詢結果:");Console.WriteLine("企業代碼\t企業名稱\t是否有檢查記錄\t檢查得分");foreach (var item in result){Console.WriteLine($"{item.EnterpriseID}\t{item.Name}\t{item.HasCheckRecord}\t\t{item.CheckScore}");}}}
}
代碼解析

上述代碼實現了一個典型的左關聯查詢場景:

  1. 數據準備:創建了兩個實體類EnterpriseAssetCheckRecord,并初始化了示例數據。

  2. 條件篩選:首先篩選出特定日期范圍內且資產類型匹配的檢查記錄:

    csharp

    var filteredRecords = checkRecords.Where(r => r.StartDate.Date == startDate.Date&& r.EndDate.Date == endDate.Date&& r.MonthEndType.Equals(assetType)).ToList();
    
  3. 左關聯查詢:使用查詢語法實現左關聯,確保返回所有企業信息,并標記是否有檢查記錄:

    csharp

    var result = from e in enterprisesjoin r in filteredRecordson e.Code equals r.EnterpriseID into enterpriseGroupfrom g in enterpriseGroup.DefaultIfEmpty()select new { ... };
    
  4. 結果處理:通過DefaultIfEmpty()方法處理可能的空值情況,并使用空合并運算符??提供默認值。

執行結果分析

運行上述代碼,輸出結果如下:

plaintext

企業資產檢查記錄查詢結果:
企業代碼	企業名稱	是否有檢查記錄	檢查得分
E001	ABC公司	True		95.5
E002	XYZ公司	False		0
E003	123公司	True		88
E004	TEST公司	False		0

可以看到,即使某些企業沒有對應的檢查記錄(如 E002 和 E004),它們仍然會出現在結果集中,并且HasCheckRecord字段被標記為False,檢查得分為 0。

方法語法實現左關聯

除了查詢語法,Linq 還提供了方法語法來實現左關聯,以下是等效的方法語法實現:

csharp

var result = enterprises.GroupJoin(filteredRecords,e => e.Code,r => r.EnterpriseID,(e, group) => new { Enterprise = e, Records = group }).SelectMany(temp => temp.Records.DefaultIfEmpty(),(temp, r) => new{EnterpriseID = temp.Enterprise.Code,Name = temp.Enterprise.Name,HasCheckRecord = r != null,CheckScore = r?.CheckScore ?? 0});

這種方法語法雖然更加函數式,但理解起來可能稍復雜一些。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/89455.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/89455.shtml
英文地址,請注明出處:http://en.pswp.cn/web/89455.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【機器學習深度學習】LoRA 微調詳解:大模型時代的高效適配利器

目錄 前言 一、LoRA 的核心思想 二、LoRA 為什么高效&#xff1f; ? 1. 參數效率 ? 2. 內存友好 ? 3. 即插即用 三、LoRA 適用場景 四、LoRA 實踐建議 五、LoRA 和全參數微調對比 六、 LoRA的具體定位 &#x1f4cc; 總結 &#x1f517; 延伸閱讀 前言 在大模型…

vue頁面不銷毀的情況下再返回,總是執行created,而不觸發 activated

vue頁面不銷毀的情況下再返回&#xff0c;總是執行created&#xff0c;而不觸發 activated 原因&#xff1a; 沒有進行頁面緩存地址和頁面組件的name沒對上 解決方案: 組件只有在被 包裹時才會觸發 activated 和 deactivated 生命周期 如果沒有被緩存&#xff0c;每次進入路由…

從 C# 到 Python:6 天極速入門(第二天)

作為一名資深 C# 開發者&#xff0c;我們在第一天已經掌握了 Python 的基礎語法框架。今天我們將深入 Python 的特色語法與高級特性&#xff0c;通過實際項目開發場景的代碼對比&#xff0c;理解這些特性在真實業務中的應用價值。一、簡潔語法糖&#xff1a;項目開發中的實戰應…

MyBatis 動態 SQL:讓 SQL 語句隨條件靈活變化

目錄 1. 動態SQL 1.1. if 1.1.1. 持久層接口添加方法 1.1.2. 映射文件添加標簽 1.1.3. 編寫測試方法 1.2. where 1.3. set 1.4. choose、when、otherwise 1.5. foreach 1.5.1. 遍歷數組 1.5.2. 遍歷Collection 1.5.3. 遍歷Map 2. 總結 前言 本文來講解MyBatis的動…

AI 驅動的儀表板:從愿景到 Kibana

作者&#xff1a;來自 Elastic Jeffrey Rengifo 及 Toms Mura 使用 LLM 處理圖像并將其轉換為 Kibana 儀表板。 想獲得 Elastic 認證&#xff1f;了解下一次 Elasticsearch Engineer 培訓的舉辦時間&#xff01; Elasticsearch 擁有眾多新功能&#xff0c;幫助你為你的使用場景…

AI產品經理面試寶典第17天:AI時代敏捷開發與MVP構建面試題與答法

機器學習MVP構建問題怎么答? 面試官:請舉例說明如何將業務問題轉化為機器學習可解的問題? 你的回答:以電商供應商評價為例,傳統方法用人工設定的低維度指標評分,而機器學習能利用大數據構建高維模型。比如通過供應商歷史交易數據、物流時效、售后投訴率等數百個特征,訓…

HBase2.5.4單機模式與偽分布式的安裝與配置(Ubuntu系統)

HBase的安裝也分為三種&#xff0c;單機模式、偽分布式模式、完全分布式模式&#xff1b;我們先來安裝單機版。 一、環境準備 1. 系統要求 Ubuntu 20.04/22.04 LTS Java 8&#xff08;必須&#xff0c;HBase不兼容更高版本&#xff09; Hadoop&#xff08;單機模式不需要&a…

Honeywell霍尼韋爾DV-10 變速器放大器 輸入 15-28 VDC,輸出 +/- 10VDC 060-6881-02

Honeywell霍尼韋爾DV-10 變速器放大器 輸入 15-28 VDC,輸出 /- 10VDC 060-6881-02

騰訊位置商業授權鴻蒙地圖SDK工程配置

工程配置 安裝 DevEco Studio 開發環境 手機HarmonyOS系統&#xff1a;OpenHarmony-5.0.0.71及以上DevEco Studio版本&#xff1a;DevEco Studio NEXT Release(Build Version: 5.0.3.900)及以上 獲取key與生成秘鑰 獲取key 登錄騰訊位置服務控制臺&#xff0c;未注冊過賬號可…

RocketMQ源碼級實現原理-Commitlog刷盤機制

刷盤機制 同步刷盤 代碼實現 寫入線程 寫入線程可能同時有多個&#xff0c;但是刷盤線程至始至終就是一個單線程 刷盤線程&#xff0c;始終是操作雙緩沖區域&#xff0c;一個用來刷盤&#xff0c;另一個用來接收多個寫入線程同時寫入刷盤請求 刷盤線程 通過這種方式&#xff0…

Java與Vue技術搭建的SRM招標采購管理系統,提供源碼,涵蓋招標、投標、評標全流程,助力企業高效規范采購管理

前言&#xff1a;在當今競爭激烈的商業環境中&#xff0c;高效、透明、規范的招標采購流程對于企業的成本控制、供應鏈穩定以及整體運營效率至關重要。SRM招標采購管理系統應運而生&#xff0c;它借助先進的信息技術&#xff0c;整合了招標采購的各個環節&#xff0c;實現了采購…

Kotlin集合分組

集合的分組&#xff08;Grouping&#xff09; 在之前的學習中&#xff0c;我們已經學會了如何對集合進行過濾、排序或執行聚合操作。 在本節中&#xff0c;我們將學習如何對集合元素進行分組&#xff0c;以便以最適合我們任務的方式呈現信息。分組&#xff08;Grouping&#xf…

阿里云ssh證書過期,如果更換并上傳到服務器

登錄阿里云平臺&#xff0c;在控制臺中找到“數字證書管理服務”進入頻道后&#xff0c;選擇“SSL證書管理”點擊“創建證書”&#xff0c;創建成功后&#xff0c;進入證書詳情頁選擇“下載”板塊&#xff0c;根據自身服務器類型&#xff0c;下載相應的證書即可服務器更新證書登…

【軟件系統架構】系列七:系統性能——計算機性能深入解析

目錄 一、什么是計算機性能&#xff1f; 二、計算機性能核心指標 1. CPU性能指標 2. 內存性能指標 3. 存儲子系統性能 4. 網絡性能指標 5. 系統資源使用與并發能力 三、性能瓶頸分析方法 四、計算機性能評測與對比 常見性能測試指標與工具&#xff1a; 五、計算機性…

基于現代R語言【Tidyverse、Tidymodel】的機器學習方法

機器學習已經成為繼理論、實驗和數值計算之后的科研“第四范式”&#xff0c;是發現新規律&#xff0c;總結和分析實驗結果的利器。機器學習涉及的理論和方法繁多&#xff0c;編程相當復雜&#xff0c;一直是阻礙機器學習大范圍應用的主要困難之一&#xff0c;由此誕生了Python…

Python暑期學習筆記5

時間&#xff1a;2025.7.18學習內容&#xff1a;【語法基礎】while循環與循環嵌套一、循環語句循環流程圖二、while循環基本格式&#xff1a;while條件&#xff1a;循環體&#xff08;條件滿足時段做的事情&#xff09;改變變量死循環while True:循環體&#xff08;要循環做的事…

world models and Human–Object Interaction (HOI)

Author: Chatgpt Here are several key research papers that explore the intersection of world models and Human–Object Interaction (HOI)—especially ones that build structured, object-centric representations from videos or use world-model-based learning to p…

無人值守共享自習室物聯系統安全防線:從設備到數據的全面防護策略!

在“全民學習”浪潮的推動下&#xff0c;無人值守共享自習室憑借24小時開放、靈活預約和沉浸式體驗&#xff0c;已成為城市學習空間的新形態。而當人力值守被物聯網設備替代后&#xff0c;安全風險卻從物理世界延伸到了數字世界。一套完整的自習室物聯網系統包含門禁、傳感器、…

【27】MFC入門到精通——MFC 修改用戶界面登錄IP IP Address Control

界面搭建 將【IP Address Control】控件&#xff0c;【Edit Control】控件和兩個【button】控件分別拖入主界面 將ID分別修改為&#xff1a;IDC_IP_ADDRESS IDC_IPADDRESS_EDIT IDC_GET_BUTTON IDC_CLEAN_BUTTON添加變量 為【IP Address Control】控件添加變量【m_IPaddress】&…

MacOS安裝linux虛擬機

在學習docker時用的云環境本身就是一個容器&#xff0c;啟動docker總是各種問題&#xff0c;所以直接在本機上裝一個虛擬機。 當前系統環境&#xff1a; 安裝虛擬機軟件 安裝UTM 下載官網&#xff1a;https://mac.getutm.app/ uname -m查看一下指令架構&#xff0c;下載…