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 開發,但它提供的進階功能可能較少。

在 .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

範例:在 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程式碼描述
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程式碼描述
所提供的程式碼在 ASP.NET Core 應用程式中定義了一個名為 ServiceController 的 ODataController,可使用 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())程式碼描述
本代碼在 .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 查詢選項來查詢服務,例如:
https://localhost:7131/odata/Service程式的輸出

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

在專案中加入 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本範例先建立一個簡單的 Employee 記錄,然後再使用 IronPDF 來產生一個顯示此人姓名的 PDF 文件。 它展示了 C# 記錄如何在 .NET 應用程式中與 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 中處理資料至關重要。







