跳過到頁腳內容
.NET幫助

C# LINQ 連接查詢語法(對於開發者的運行原理)

在C#程式設計的多樣性中,LINQ (語言集成查詢)脫穎而出,作為查詢和操作物件集合的強大工具。 在LINQ提供的眾多運算子中,Join運算子是在合併來自多個來源的資料時的關鍵角色。

在本文中,我們將深入探討C# LINQ Join運算子的複雜性,揭示其功能、語法和實際應用。

理解Join子句的基礎知識

從根本上說,LINQ Join運算子旨在根據指定條件合併來自兩個或多個集合的元素。 此運算子使開發人員能夠對內存集合執行類似SQL的連接,輕鬆合併來自不同來源的資料。

LINQ Join運算子的語法

LINQ Join運算子的語法變得富有表現力,遵循類似SQL連接的模式。 基本語法如下:

var queryResult = 
    from element1 in collection1
    join element2 in collection2 on element1.Key equals element2.Key
    select new { element1, element2 };
var queryResult = 
    from element1 in collection1
    join element2 in collection2 on element1.Key equals element2.Key
    select new { element1, element2 };
Dim queryResult = From element1 In collection1
	Join element2 In collection2 On element1.Key Equals element2.Key
	Select New With {
		Key element1,
		Key element2
	}
$vbLabelText   $csharpLabel

在此語法中:

  • element1element2是表示來自collection1collection2的元素的變量。
  • element1.Keyelement2.Key是用作連接操作基礎的屬性。
  • equals關鍵字指定連接的條件。
  • select子句創建一個新物件,將來自兩個集合的元素組合在一起。

LINQ連接類型

LINQ支援幾種連接類型,包括:

  1. 內連接:只返回在兩個集合中具有匹配鍵的元素。

    var innerJoin = from customer in customers
                    join order in orders on customer.CustomerID equals order.CustomerID // join orders to customers based on the customer ID key
                    select new { customer.CustomerID, customer.CustomerName, order.OrderID }; // create a new anonymous object based on the objects obtained from the join
    var innerJoin = from customer in customers
                    join order in orders on customer.CustomerID equals order.CustomerID // join orders to customers based on the customer ID key
                    select new { customer.CustomerID, customer.CustomerName, order.OrderID }; // create a new anonymous object based on the objects obtained from the join
    Dim innerJoin = From customer In customers ' create a new anonymous object based on the objects obtained from the join
    	Join order In orders On customer.CustomerID Equals order.CustomerID
    	Select New With {
    		Key customer.CustomerID,
    		Key customer.CustomerName,
    		Key order.OrderID
    	}
    $vbLabelText   $csharpLabel
  2. 左外連接(預設):返回左集合中所有元素以及右集合中匹配的元素。 如果找不到匹配,結果將包含右側元素的預設值。

    var leftOuterJoin = from customer in customers
                        join order in orders on customer.CustomerID equals order.CustomerID into customerOrders
                        from co in customerOrders.DefaultIfEmpty()
                        select new { customer.CustomerID, customer.CustomerName, OrderID = co?.OrderID ?? -1 };
    var leftOuterJoin = from customer in customers
                        join order in orders on customer.CustomerID equals order.CustomerID into customerOrders
                        from co in customerOrders.DefaultIfEmpty()
                        select new { customer.CustomerID, customer.CustomerName, OrderID = co?.OrderID ?? -1 };
    Dim leftOuterJoin = From customer In customers
    	Group Join order In orders On customer.CustomerID Equals order.CustomerID Into customerOrders = Group
    	From co In customerOrders.DefaultIfEmpty()
    	Select New With {
    		Key customer.CustomerID,
    		Key customer.CustomerName,
    		Key .OrderID = If(co?.OrderID, -1)
    	}
    $vbLabelText   $csharpLabel
  3. 群組連接:將左側集合中的元素與右側集合中匹配的元素分組。

    var groupJoin = from customer in customers
                    join order in orders on customer.CustomerID equals order.CustomerID into customerOrders
                    select new { customer.CustomerID, customer.CustomerName, Orders = customerOrders };
    var groupJoin = from customer in customers
                    join order in orders on customer.CustomerID equals order.CustomerID into customerOrders
                    select new { customer.CustomerID, customer.CustomerName, Orders = customerOrders };
    Dim groupJoin = From customer In customers
    	Group Join order In orders On customer.CustomerID Equals order.CustomerID Into customerOrders = Group
    	Select New With {
    		Key customer.CustomerID,
    		Key customer.CustomerName,
    		Key .Orders = customerOrders
    	}
    $vbLabelText   $csharpLabel

實際應用:合併客戶和訂單資料

讓我們考慮一個實際例子,我們有兩個集合:customersorders。 我們希望創建一個結果集合,透過使用LINQ Join運算子將客戶資訊與其相應的訂單合併。

var customerOrderInfo = 
    from customer in customers
    join order in orders on customer.CustomerID equals order.CustomerID
    select new { customer.CustomerID, customer.CustomerName, order.OrderID, order.OrderDate };
var customerOrderInfo = 
    from customer in customers
    join order in orders on customer.CustomerID equals order.CustomerID
    select new { customer.CustomerID, customer.CustomerName, order.OrderID, order.OrderDate };
Dim customerOrderInfo = From customer In customers
	Join order In orders On customer.CustomerID Equals order.CustomerID
	Select New With {
		Key customer.CustomerID,
		Key customer.CustomerName,
		Key order.OrderID,
		Key order.OrderDate
	}
$vbLabelText   $csharpLabel

在此範例中,結果集合將包含客戶資訊以及其關聯的訂單條目。 連接擴展方法語法幫助C#開發人員執行類似SQL的連接操作。

介绍 IronPDF

C# LINQ Join Query Syntax (How It Works For Developers): Figure 1 - IronPDF網頁

使用IronPDF開發PDF解決方案是一個全面的C#庫,專為創建、處理和編輯PDF文件設計。 它能夠讓開發人員從多種資料源動態生成PDF,使其成為需要PDF文檔生成的應用程序的多功能解決方案。

安裝IronPDF:快速入門

要開始在您的 C# 項目中利用 IronPDF 庫,您可以輕鬆安裝 IronPDF NuGet 套件。 在您的包管理器控制台中使用以下命令:

Install-Package IronPdf 

或者,您可以在NuGet程序包管理器中搜索"IronPDF"並從那裡安裝。

C# LINQ Join Query Syntax (How It Works For Developers): Figure 2 - 通過NuGet包管理器安裝IronPDF庫

LINQ Join和IronPDF:動態雙雄?

LINQ Join運算子以其合併不同來源資料的能力而聞名,在資料整合是關鍵的場景中可是一個有價值的資產。 當談到利用LINQ Join與IronPDF搭配時,主要考量的是您意圖整合到PDF文檔中的資料性質。

IronPDF的亮點是其HTML到PDF轉換功能,可保持您的佈局和樣式不變。 此功能允許從網頁內容生成PDF,適用於報告、發票和文檔。 HTML 文件、URL 和 HTML 字符串都可以無縫轉換為 PDF。

using IronPdf;

class Program
{
    static void Main(string[] args)
    {
        var renderer = new ChromePdfRenderer();

        // 1. Convert HTML String to PDF
        var htmlContent = "<h1>Hello, IronPDF!</h1><p>This is a PDF from an HTML string.</p>";
        var pdfFromHtmlString = renderer.RenderHtmlAsPdf(htmlContent);
        pdfFromHtmlString.SaveAs("HTMLStringToPDF.pdf");

        // 2. Convert HTML File to PDF
        var htmlFilePath = "path_to_your_html_file.html"; // Specify the path to your HTML file
        var pdfFromHtmlFile = renderer.RenderHtmlFileAsPdf(htmlFilePath);
        pdfFromHtmlFile.SaveAs("HTMLFileToPDF.pdf");

        // 3. Convert URL to PDF
        var url = "http://ironpdf.com"; // Specify the URL
        var pdfFromUrl = renderer.RenderUrlAsPdf(url);
        pdfFromUrl.SaveAs("URLToPDF.pdf");
    }
}
using IronPdf;

class Program
{
    static void Main(string[] args)
    {
        var renderer = new ChromePdfRenderer();

        // 1. Convert HTML String to PDF
        var htmlContent = "<h1>Hello, IronPDF!</h1><p>This is a PDF from an HTML string.</p>";
        var pdfFromHtmlString = renderer.RenderHtmlAsPdf(htmlContent);
        pdfFromHtmlString.SaveAs("HTMLStringToPDF.pdf");

        // 2. Convert HTML File to PDF
        var htmlFilePath = "path_to_your_html_file.html"; // Specify the path to your HTML file
        var pdfFromHtmlFile = renderer.RenderHtmlFileAsPdf(htmlFilePath);
        pdfFromHtmlFile.SaveAs("HTMLFileToPDF.pdf");

        // 3. Convert URL to PDF
        var url = "http://ironpdf.com"; // Specify the URL
        var pdfFromUrl = renderer.RenderUrlAsPdf(url);
        pdfFromUrl.SaveAs("URLToPDF.pdf");
    }
}
Imports IronPdf

Friend Class Program
	Shared Sub Main(ByVal args() As String)
		Dim renderer = New ChromePdfRenderer()

		' 1. Convert HTML String to PDF
		Dim htmlContent = "<h1>Hello, IronPDF!</h1><p>This is a PDF from an HTML string.</p>"
		Dim pdfFromHtmlString = renderer.RenderHtmlAsPdf(htmlContent)
		pdfFromHtmlString.SaveAs("HTMLStringToPDF.pdf")

		' 2. Convert HTML File to PDF
		Dim htmlFilePath = "path_to_your_html_file.html" ' Specify the path to your HTML file
		Dim pdfFromHtmlFile = renderer.RenderHtmlFileAsPdf(htmlFilePath)
		pdfFromHtmlFile.SaveAs("HTMLFileToPDF.pdf")

		' 3. Convert URL to PDF
		Dim url = "http://ironpdf.com" ' Specify the URL
		Dim pdfFromUrl = renderer.RenderUrlAsPdf(url)
		pdfFromUrl.SaveAs("URLToPDF.pdf")
	End Sub
End Class
$vbLabelText   $csharpLabel

場景1:PDF生成之前合併資料

如果您的目標是在啟動PDF生成過程之前合併來自不同資料來源的資料,可以獨立使用LINQ Join。 一旦擁有統一的資料集,您便可以利用IronPDF根據整合的資料動態生成PDF文檔。

這裡有一個簡化的例子:

// Assume 'customerOrderInfo' is a result set obtained using LINQ Join
var pdfDocument = new IronPdf.ChromePdfRenderer();
foreach (var entry in customerOrderInfo)
{
    // Use IronPDF to add content to the PDF based on integrated data
    pdfDocument.AddHTML($"<p>Customer ID: {entry.CustomerID}, Order ID: {entry.OrderID}</p>");
}
// Save or render the PDF document as needed
pdfDocument.SaveAs("IntegratedDataDocument.pdf");
// Assume 'customerOrderInfo' is a result set obtained using LINQ Join
var pdfDocument = new IronPdf.ChromePdfRenderer();
foreach (var entry in customerOrderInfo)
{
    // Use IronPDF to add content to the PDF based on integrated data
    pdfDocument.AddHTML($"<p>Customer ID: {entry.CustomerID}, Order ID: {entry.OrderID}</p>");
}
// Save or render the PDF document as needed
pdfDocument.SaveAs("IntegratedDataDocument.pdf");
' Assume 'customerOrderInfo' is a result set obtained using LINQ Join
Dim pdfDocument = New IronPdf.ChromePdfRenderer()
For Each entry In customerOrderInfo
	' Use IronPDF to add content to the PDF based on integrated data
	pdfDocument.AddHTML($"<p>Customer ID: {entry.CustomerID}, Order ID: {entry.OrderID}</p>")
Next entry
' Save or render the PDF document as needed
pdfDocument.SaveAs("IntegratedDataDocument.pdf")
$vbLabelText   $csharpLabel

探索PDF文檔生成的更多方法以及如何使用IronPDF的連接方法,請訪問IronPDF文檔

場景2:PDF生成過程中的動態資料整合

IronPDF允許將動態內容添加到PDF文檔中,從而可以在PDF生成過程中本身透過LINQ Join整合資料。 在這裡,我們將創建和訂購客戶類,以代表實際應用。 資料來源可以是SQL資料庫或其他結構化格式,在此情況下,一個物件的列表包含一組資料屬性,就像資料庫中的表一樣。 以下範例顯示了LINQ Join方法與IronPDF的詳細整合,我們使用HTML字串生成PDF來創建文檔:

using System;
using System.Collections.Generic;
using System.Linq;
using IronPdf;

class Order
{
    public int OrderID { get; set; }
    public int CustomerID { get; set; }
    // Other order-related properties...
}

class Customer
{
    public int CustomerID { get; set; }
    // Other customer-related properties...
}

class Program
{
    static void Main()
    {
        // Sample orders collection
        var orders = new List<Order>
        {
            new Order { OrderID = 1, CustomerID = 1 },
            new Order { OrderID = 2, CustomerID = 1 },
            new Order { OrderID = 3, CustomerID = 2 },
        };

        // Sample customers collection
        var customers = new List<Customer>
        {
            new Customer { CustomerID = 1 },
            new Customer { CustomerID = 2 },
        };

        var pdfDocument = new ChromePdfRenderer();
        string htmlContent = "<h1>Details generated using LINQ JOIN</h1>";

        // Use join to find customer orders
        var query = from customer in customers
                    join order in orders on customer.CustomerID equals order.CustomerID
                    select new { CustomerID = customer.CustomerID, OrderID = order.OrderID };

        foreach (var result in query)
        {
            // Use IronPDF to dynamically add content to the PDF based on integrated data
            htmlContent += $"<p>Customer ID: {result.CustomerID}, Order ID: {result.OrderID}</p>";
        }

        // Save or render the PDF document as needed
        pdfDocument.RenderHtmlAsPdf(htmlContent)
                   .SaveAs("DynamicIntegratedDataDocument.pdf");
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using IronPdf;

class Order
{
    public int OrderID { get; set; }
    public int CustomerID { get; set; }
    // Other order-related properties...
}

class Customer
{
    public int CustomerID { get; set; }
    // Other customer-related properties...
}

class Program
{
    static void Main()
    {
        // Sample orders collection
        var orders = new List<Order>
        {
            new Order { OrderID = 1, CustomerID = 1 },
            new Order { OrderID = 2, CustomerID = 1 },
            new Order { OrderID = 3, CustomerID = 2 },
        };

        // Sample customers collection
        var customers = new List<Customer>
        {
            new Customer { CustomerID = 1 },
            new Customer { CustomerID = 2 },
        };

        var pdfDocument = new ChromePdfRenderer();
        string htmlContent = "<h1>Details generated using LINQ JOIN</h1>";

        // Use join to find customer orders
        var query = from customer in customers
                    join order in orders on customer.CustomerID equals order.CustomerID
                    select new { CustomerID = customer.CustomerID, OrderID = order.OrderID };

        foreach (var result in query)
        {
            // Use IronPDF to dynamically add content to the PDF based on integrated data
            htmlContent += $"<p>Customer ID: {result.CustomerID}, Order ID: {result.OrderID}</p>";
        }

        // Save or render the PDF document as needed
        pdfDocument.RenderHtmlAsPdf(htmlContent)
                   .SaveAs("DynamicIntegratedDataDocument.pdf");
    }
}
Imports System
Imports System.Collections.Generic
Imports System.Linq
Imports IronPdf

Friend Class Order
	Public Property OrderID() As Integer
	Public Property CustomerID() As Integer
	' Other order-related properties...
End Class

Friend Class Customer
	Public Property CustomerID() As Integer
	' Other customer-related properties...
End Class

Friend Class Program
	Shared Sub Main()
		' Sample orders collection
		Dim orders = New List(Of Order) From {
			New Order With {
				.OrderID = 1,
				.CustomerID = 1
			},
			New Order With {
				.OrderID = 2,
				.CustomerID = 1
			},
			New Order With {
				.OrderID = 3,
				.CustomerID = 2
			}
		}

		' Sample customers collection
		Dim customers = New List(Of Customer) From {
			New Customer With {.CustomerID = 1},
			New Customer With {.CustomerID = 2}
		}

		Dim pdfDocument = New ChromePdfRenderer()
		Dim htmlContent As String = "<h1>Details generated using LINQ JOIN</h1>"

		' Use join to find customer orders
		Dim query = From customer In customers
			Join order In orders On customer.CustomerID Equals order.CustomerID
			Select New With {
				Key .CustomerID = customer.CustomerID,
				Key .OrderID = order.OrderID
			}

		For Each result In query
			' Use IronPDF to dynamically add content to the PDF based on integrated data
			htmlContent &= $"<p>Customer ID: {result.CustomerID}, Order ID: {result.OrderID}</p>"
		Next result

		' Save or render the PDF document as needed
		pdfDocument.RenderHtmlAsPdf(htmlContent).SaveAs("DynamicIntegratedDataDocument.pdf")
	End Sub
End Class
$vbLabelText   $csharpLabel

此代碼利用join關鍵字,可幫助找到每個客戶的匹配訂單,使查詢更簡潔和富於表現力。

C# LINQ Join Query Syntax (How It Works For Developers): Figure 3 - 來自先前代碼範例的輸出PDF

結論

總之,IronPDF在C#應用程序中作為PDF生成的強大解決方案。 結合強大的LINQ Join運算子,開發人員可以在PDF生成過程之前或過程中實現無縫的資料整合。 無論您是需要合併客戶資訊與訂單或合併來自不同來源的資料,LINQ Join和IronPDF的動態雙雄能夠提供靈活且高效的方法來增強C#應用程序中PDF生成的能力。

總之,C# LINQ Join運算子是一個強大的工具,用於無縫整合來自多個來源的資料。 無論您正在處理資料庫、API響應或內存集合,LINQ Join運算子簡化了基於指定條件合併資料的過程。 在您導航C#應用程序中多樣化的資料連接時,考慮LINQ Join運算子為您的資料整合工具包帶來的力量和靈活性。 掌握此運算子為高效地處理和操作資料打開了新的可能性,增強了您C#應用程序的能力。

IronPDF提供免費試用供評估以測試其完整功能。 然而,一旦試用期限結束,它需要正確授權

常見問題解答

C# LINQ Join 運算子的目的是什麼?

C# LINQ Join 運算子是為了根據指定條件合併多個集合中的數據設計的。它允許開發人員執行類似 SQL Join 的複雜數據整合,使其在內存中的數據操縱中變得無價。

怎樣在 C# 中將 HTML 轉換為 PDF?

您可以使用 IronPDF 的 RenderHtmlAsPdf 方法將 HTML 字符串轉換為 PDF。您還可以使用 RenderHtmlFileAsPdf 將 HTML 文件轉換為 PDF。

LINQ 支援哪種類型的 Join?

LINQ 支持多種類型的 Join,包括內部 Join、左外部 Join 和群組 Join。這些 Join 類型允許不同層次的數據整合,例如僅返回匹配元素或包括來自一個來源集合的所有元素。

LINQ Join 可以在真實場景中如何應用?

LINQ Join 可以在真實場景中用於合併來自不同來源的數據,例如將客戶信息與其訂單數據結合。這種整合有助於全面的數據分析和報告。

如何在我的項目中安裝 C# 圖書館來生成 PDF?

您可以透過 NuGet 套件管理器,使用命令 Install-Package IronPdf 在套件管理器控制台中,或在 NuGet 套件管理器中搜尋 'IronPDF',將 IronPDF 安裝在您的 C# 專案中。

在 C# 中使用 PDF 生成庫有什麼好處?

使用像 IronPDF 這樣的庫可以從各種數據來源動態生成 PDF,維持內容的佈局和樣式。尤其適用於將 HTML 內容轉為 PDF 來製作報告、發票和其他文檔。

LINQ Join 和 PDF 生成庫如何一起工作?

您可以使用 LINQ Join 整合來自多種來源的數據,然後使用 IronPDF 生成 PDF。這個組合允許創建基於全面和整合數據集的動態 PDF 文檔。

我可以在 PDF 生成過程中使用 LINQ Join 嗎?

是的,您可以在使用 IronPDF 生成 PDF 時使用 LINQ Join 來整合數據。這使得製作能夠反映實時數據整合的動態文檔成為可能,從而提高效率和靈活性。

HTML 到 PDF 轉換功能提供什麼功能?

IronPDF 的 HTML 到 PDF 轉換功能允許您將 HTML 文件、URL 和 HTML 字符串轉換為 PDF,同時保留佈局和樣式。這對於從網頁內容生成視覺一致的 PDF 文檔特別有用。

是否有 PDF 生成庫的評估選項可用?

是的,IronPDF 提供用於評估目的的免費試用版。在試用期結束後,繼續使用庫的全部功能需要適當的許可。

Curtis Chau
技術作家

Curtis Chau 擁有卡爾頓大學計算機科學學士學位,專注於前端開發,擅長於 Node.js、TypeScript、JavaScript 和 React。Curtis 熱衷於創建直觀且美觀的用戶界面,喜歡使用現代框架並打造結構良好、視覺吸引人的手冊。

除了開發之外,Curtis 對物聯網 (IoT) 有著濃厚的興趣,探索將硬體和軟體結合的創新方式。在閒暇時間,他喜愛遊戲並構建 Discord 機器人,結合科技與創意的樂趣。