跳過到頁腳內容
.NET幫助

OData C# (如何為開發人員運作)

開放資料通訊協定 (OData)簡化了 Microsoft .NET 開發中建立和使用 RESTful API 的過程。 它提供標準化的方法,透過熟悉的 CRUD(建立、讀取、更新、刪除)作業來查詢和處理資料。 本文探討 Open Data Protocol 如何簡化 .NET 中的 API 開發,提供範例並強調其主要優點。 若要探索更多關於 OData 的資訊,您可以查看 OData C# GitHub Repository 以取得原始碼。

!a href="/static-assets/pdf/blog/odata-csharp/odata-csharp-1.webp">OData C# (How It Works For Developers):圖 1 - OData C#- 資料存取通訊協定。

OData 遵循建立 RESTful Web API 的標準做法,使用 URL 和 HTTP 動詞(如 GET 和 POST)來定義操作。 它使用實體資料模型 (EDM) 和 JSON 或 AtomPub 進行訊息編碼來表示資料。 雖然 OData 比 GraphQL 簡化了 API 開發,但它提供的進階功能可能較少。

OData C# (How It Works For Developers):圖 2 - OData

在 .NET 中使用 OData 的優點

  • 標準化: OData 強制採用一致的方式來定義實體資料模型、處理請求和格式化回應。 這可降低開發的複雜性,並簡化客戶端應用程式的整合。
  • 豐富的查詢功能: OData 支援統一的資料查詢方式,以執行 CRUD 操作、過濾 ($filter)、排序 (Ascending Order/ Descending Order)($orderby),以及分頁 ($top,$skip)功能,讓客戶端能有效率地擷取特定的資料集。
  • 改善開發人員經驗:OData 的 .NET 函式庫可簡化 API 開發。 開發人員可以利用預先建立的元件進行路由、查詢處理和資料序列化,減少程式碼重複和開發時間。
  • 互操作性:來自不同平台的 OData 相容用戶端可與您基於 .NET 的 OData 服務進行無縫互動,促進更廣泛的應用程式整合。

在.NET Framework 中使用 OData入門。

用於 OData 的 .NET 函式庫透過促進操作資料集的有效方式,提升開發人員的經驗。 它簡化了在 .NET 開發中建立和使用 RESTful API 的過程。 它透過熟悉的 CRUD 作業 (建立、讀取、更新、刪除),提供查詢和操作資料的標準化方法。

在 .NET 專案中設定 OData

首先在 Visual Studio 中開啟您的新專案。 然後,導覽到"解決方案總管",在專案上按一下滑鼠右鍵,並選擇"管理 NuGet 套件"。 搜尋 Microsoft.AspNetCore.OData 並安裝。 目前的 OData 版本為 8.2.5。

若要在 NuGet Package Manager Console 中安裝 OData,請使用下列指令。

Install-Package Microsoft.AspNetCore.OData

OData C# (How It Works For Developers):圖 3 - 安裝 OData

範例:在 ASP.NET Core 中建立 OData 服務。

讓我們在 ASP.NET Core 應用程式中建立一個簡單的 OData 模型類別。 在以下的程式碼中,以下的類別將會揭露可使用 OData 語法查詢的服務清單。

public class Service
{
    public int Id { get; set; } 
    public string FirstName { get; set; }
    public decimal Price { get; set; }
}
public class Service
{
    public int Id { get; set; } 
    public string FirstName { get; set; }
    public decimal Price { get; set; }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

程式碼描述

Service 類代表 C# 中用於管理服務的基本資料結構。它包含三個屬性:Id:服務的整數識別碼。FirstName:代表與服務關聯的名字的字串。Price:價格:表示服務價格的十進位數值。在 .NET 開發中,此類別可用來建立更複雜的服務相關功能。 我們也可能會根據情境使用集合或導覽屬性。

以下是如何在 Visual Studio 中的 ASP.NET Core 應用程式中設定 OData 控制器,以透過標準化的 OData 端點揭露服務清單。 以下範例示範了使用靜態服務清單並在 Web API 中啟用 OData 查詢功能的基本實作:

using DemoOData.Models;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.OData.Query;
using Microsoft.AspNetCore.OData.Routing.Controllers;

namespace DemoOData.Controllers
{
    [Route("odata/[controller]")]
    public class ServiceController : ODataController
    {
        private static readonly List<Service> Products = new List<Service>
        {
            new Service { Id = 1, FirstName = "Laptop", Price = 6239.9M },
            new Service { Id = 2, FirstName = "Smartphone", Price = 2585.9M }
        };

        [HttpGet]
        [EnableQuery]
        public IActionResult Get() => Ok(Products);
    }
}
using DemoOData.Models;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.OData.Query;
using Microsoft.AspNetCore.OData.Routing.Controllers;

namespace DemoOData.Controllers
{
    [Route("odata/[controller]")]
    public class ServiceController : ODataController
    {
        private static readonly List<Service> Products = new List<Service>
        {
            new Service { Id = 1, FirstName = "Laptop", Price = 6239.9M },
            new Service { Id = 2, FirstName = "Smartphone", Price = 2585.9M }
        };

        [HttpGet]
        [EnableQuery]
        public IActionResult Get() => Ok(Products);
    }
}
Imports DemoOData.Models
Imports Microsoft.AspNetCore.Mvc
Imports Microsoft.AspNetCore.OData.Query
Imports Microsoft.AspNetCore.OData.Routing.Controllers

Namespace DemoOData.Controllers
	<Route("odata/[controller]")>
	Public Class ServiceController
		Inherits ODataController

		Private Shared ReadOnly Products As New List(Of Service) From {
			New Service With {
				.Id = 1,
				.FirstName = "Laptop",
				.Price = 6239.9D
			},
			New Service With {
				.Id = 2,
				.FirstName = "Smartphone",
				.Price = 2585.9D
			}
		}

		<HttpGet>
		<EnableQuery>
		Public Function [Get]() As IActionResult
			Return Ok(Products)
		End Function
	End Class
End Namespace
$vbLabelText   $csharpLabel

程式碼描述

所提供的程式碼在 ASP.NET Core 應用程式中定義了一個名為 ServiceControllerODataController,可使用 OData 通訊協定查詢和操作資料。 它將請求路由至 odata/Service 並提供 Service 物件的靜態清單,包括一台筆記型電腦和一部智慧型手機。 使用 [EnableQuery] 進行裝飾的 Get 方法允許用戶端在產品清單上執行 OData 查詢(過濾、排序、分頁),並將結果以 IActionResult 的形式返回給 HTTP GET 請求。

在 Program.cs 中註冊 OData 服務

要將 OData 整合到 .NET 6 應用程式中,我們需要安裝和設定必要的 OData 套件。 這包括定義 OData 模型、設定 OData 中介軟體,以及設定服務以支援 OData 功能,例如過濾、排序和擴充。

using DemoOData.Models;
using Microsoft.AspNetCore.OData;
using Microsoft.OData.Edm;
using Microsoft.OData.ModelBuilder;

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

static IEdmModel GetEdmModel()
{
    ODataConventionModelBuilder builder = new ODataConventionModelBuilder();
    builder.EntitySet<Service>("Services");
    return builder.GetEdmModel();
}

builder.Services.AddControllers()
    .AddOData(options => options
        .AddRouteComponents("odata", GetEdmModel())
        .Select()
        .Filter()
        .OrderBy()
        .SetMaxTop(20)
        .Count()
        .Expand()
    );
using DemoOData.Models;
using Microsoft.AspNetCore.OData;
using Microsoft.OData.Edm;
using Microsoft.OData.ModelBuilder;

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

static IEdmModel GetEdmModel()
{
    ODataConventionModelBuilder builder = new ODataConventionModelBuilder();
    builder.EntitySet<Service>("Services");
    return builder.GetEdmModel();
}

builder.Services.AddControllers()
    .AddOData(options => options
        .AddRouteComponents("odata", GetEdmModel())
        .Select()
        .Filter()
        .OrderBy()
        .SetMaxTop(20)
        .Count()
        .Expand()
    );
Imports DemoOData.Models
Imports Microsoft.AspNetCore.OData
Imports Microsoft.OData.Edm
Imports Microsoft.OData.ModelBuilder

Private builder = WebApplication.CreateBuilder(args)

' Add services to the container.
builder.Services.AddControllers()
' Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer()
builder.Services.AddSwaggerGen()

'INSTANT VB TODO TASK: Local functions are not converted by Instant VB:
'static IEdmModel GetEdmModel()
'{
'	ODataConventionModelBuilder builder = New ODataConventionModelBuilder();
'	builder.EntitySet<Service>("Services");
'	Return builder.GetEdmModel();
'}

builder.Services.AddControllers().AddOData(Function(options) options.AddRouteComponents("odata", GetEdmModel()).Select().Filter().OrderBy().SetMaxTop(20).Count().Expand())
$vbLabelText   $csharpLabel

程式碼描述

本代碼在 .NET 6 應用程式中設定 OData 支援。 首先,它會匯入必要的命名空間,並建立一個 WebApplicationBuilder 範例。 GetEdmModel 方法使用 ODataConventionModelBuilder 定義 OData 模型,它指定了 Service 實體的實體集。 然後呼叫 AddOData 方法來設定 OData 服務,包括啟用 select、filter、order by、count、expand,以及設定查詢結果的最大頂值為 20。 此設定可確保應用程式能有效處理 OData 查詢。

AddOData() 方法使用 GetEdmModel() 方法,該方法擷取用於查詢的資料模型,形成 OData 服務的基礎。此服務利用稱為實體資料模型 (Entity Data Model, EDM) 的抽象資料模型來定義暴露的資料。 ODataConventionModelBuilder 類會透過預設命名慣例產生 EDM,將程式碼需求降至最低。 另外,開發人員也可以利用 ODataModelBuilder 類別來加強對 EDM 的控制。

程式碼的螢幕截圖

OData C# (How It Works For Developers):圖 4 - Visual Studio 中的程式碼

執行服務

執行服務之後,您可以使用各種 OData 查詢選項來查詢服務,例如:

https://localhost:7131/odata/Service

程式的輸出

OData C# (How It Works For Developers):圖 5 - OData 服務輸出

IronPDF 簡介

IronPDF 是一個全面的 C# 函式庫,設計用來簡化 .NET 應用程式內 將檔案轉換為 PDF分割 PDF 頁面,以及 從 PDF 移除頁面。 它提供了廣泛的功能,包括從 HTML、CSS、影像和 JavaScript 產生 PDF 的能力,讓開發人員可以毫不費力地將網頁內容轉換成高品質的 PDF 文件。 IronPDF 具有直觀的 API 和強大的渲染引擎,可讓開發人員簡化 PDF 生成流程,輕鬆將動態文件生成功能整合到應用程式中。

OData C# (How It Works For Developers):圖 6 - IronPdf

在專案中加入 IronPdf

若要在 Visual Studio 中安裝 IronPdf,請導航至 NuGet Package Manager Console,並使用下列指令。

Install-Package IronPdf

生成 PDF

要在 .NET 應用程式中從 HTML 內容產生 PDF 文件,我們可以使用類似 DinkToPdf 或類似的函式庫中的 ChromePdfRenderer 類。 本範例示範如何建立包含 Employee 記錄詳細資訊的 PDF。

public record Employee (string FirstName, string LastName);

class Program
{
    static void Main(string[] args)
    {
        var employee = new Employee("Iron", "Developer");
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf($"<h1>Person Record</h1><p>Name: {employee.FirstName} {employee.LastName}</p>");
        pdf.SaveAs("PersonRecord.pdf");
    }
}
public record Employee (string FirstName, string LastName);

class Program
{
    static void Main(string[] args)
    {
        var employee = new Employee("Iron", "Developer");
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf($"<h1>Person Record</h1><p>Name: {employee.FirstName} {employee.LastName}</p>");
        pdf.SaveAs("PersonRecord.pdf");
    }
}
'INSTANT VB TODO TASK: C# 'records' are not converted by Instant VB:
'public record Employee(string FirstName, string LastName)

Friend Class Program
	Shared Sub Main(ByVal args() As String)
		Dim employee As New Employee("Iron", "Developer")
		Dim renderer = New ChromePdfRenderer()
		Dim pdf = renderer.RenderHtmlAsPdf($"<h1>Person Record</h1><p>Name: {employee.FirstName} {employee.LastName}</p>")
		pdf.SaveAs("PersonRecord.pdf")
	End Sub
End Class
$vbLabelText   $csharpLabel

本範例先建立一個簡單的 Employee 記錄,然後再使用 IronPDF 來產生一個顯示此人姓名的 PDF 文件。 它展示了 C# 記錄如何在 .NET 應用程式中與 PDF 生成無縫整合。

OData C# (How It Works For Developers):圖 7 - PDF 輸出

結論

OData 透過提供標準化的查詢與操作功能,簡化了 .NET 中 RESTful API 的開發與使用。 我們也可以將其與 Entity Framework 整合,透過簡化資料存取與管理來提升開發效率。 OData 可簡化 API 開發,透過豐富的查詢功能和改善的開發人員體驗,實現跨各種平台的無縫整合和互操作性。 此外,IronPDF 為 .NET 應用程式中強大的 PDF 操作提供了全面的功能和支援。

常見問題解答

OData 如何簡化 .NET 中的 API 開發?

OData 透過提供使用 CRUD 作業查詢和操作資料的標準化通訊協定,簡化了 .NET 中的 API 開發。它使用 URL 和 HTTP 動詞遵循 RESTful 慣例,利用實體資料模型 (EDM) 以 JSON 或 AtomPub 格式表示資料。

在 .NET 應用程式中使用 OData 有哪些主要優點?

在 .NET 應用程式中使用 OData 的主要優點包括:標準化、豐富的查詢功能、改善的開發人員體驗,以及跨不同平台的互操作性,從而降低複雜性並提昇資料檢索的效率。

如何在 ASP.NET Core 應用程式中設定 OData 服務?

若要在 ASP.NET Core 應用程式中設定 OData 服務,您需要定義 OData 模型並配置中介軟體。您可以透過安裝 Microsoft.AspNetCore.OData NuGet 套件,並使用 ODataConventionModelBuilder 來定義實體資料模型。

EnableQuery 屬性在 OData 中的作用是什麼?

OData 中的 EnableQuery 屬性允許用戶端對 OData 控制器所揭露的資料執行篩選、排序和分頁等作業,增強了 API 的靈活性和可用性。

如何在 .NET 中從 HTML 內容產生 PDF?

您可以使用 IronPDF 函式庫在 .NET 中從 HTML 內容產生 PDF。透過建立 HTML 字串並使用 ChromePdfRenderer 類,您可以將 HTML 呈現為 PDF 文件,然後將其儲存為檔案。

.NET 中的 ODataConventionModelBuilder 有何作用?

.NET 中的 ODataConventionModelBuilder 用於使用預設命名慣例自動產生實體資料模型 (EDM),減少在應用程式中定義 OData 模型所需的程式碼數量。

什麼是 .NET 中 PDF 操作的綜合資料庫?

IronPDF 是用於 PDF 處理的 C# 綜合資料庫,可在 .NET 應用程式中方便地執行各種任務,例如將檔案轉換為 PDF、分割和移除 PDF 頁面,以及從 HTML 產生 PDF。

OData 如何增強 .NET 服務的互操作性?

OData 可讓遵循 OData 標準的用戶端與基於 .NET 的 OData 服務進行無縫互動,從而增強互操作性,促進不同應用程式和平台之間更廣泛的整合。

在 OData 的背景下,什麼是 CRUD 操作?

在 OData 的上下文中,CRUD 作業指的是建立、讀取、更新和刪除等基本操作,這些操作對於在 RESTful API 中處理資料至關重要。

Jacob Mellor, Team Iron 首席技术官
首席技术官

Jacob Mellor 是 Iron Software 的首席技術官,作為 C# PDF 技術的先鋒工程師。作為 Iron Software 核心代碼的原作者,他自開始以來塑造了公司產品架構,與 CEO Cameron Rimington 一起將其轉變為一家擁有超過 50 名員工的公司,為 NASA、特斯拉 和 全世界政府機構服務。

Jacob 持有曼徹斯特大學土木工程一級榮譽学士工程學位(BEng) (1998-2001)。他於 1999 年在倫敦開設了他的第一家軟件公司,並於 2005 年製作了他的首個 .NET 組件,專注於解決 Microsoft 生態系統內的複雜問題。

他的旗艦產品 IronPDF & Iron Suite .NET 庫在全球 NuGet 被安裝超過 3000 萬次,其基礎代碼繼續為世界各地的開發工具提供動力。擁有 25 年的商業經驗和 41 年的編碼專業知識,Jacob 仍專注於推動企業級 C#、Java 及 Python PDF 技術的創新,同時指導新一代技術領袖。