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

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; }
}
Public Class Service
Public Property Id As Integer
Public Property FirstName As String
Public Property Price As Decimal
End Class
程式碼描述
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 應用程式中定義了一個名為 ODataController 的 ServiceController,因此可以使用 OData 協定查詢和操作資料。 它將請求路由到 odata/Service,並提供 Service 物件的靜態列表,其中包括筆記型電腦和智慧型手機。 使用 Get 方法,並經過 [EnableQuery] 裝飾,允許客戶端對產品清單執行 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 以及將查詢結果的最大 top 值設為 20。 此設定可確保應用程式能有效處理 OData 查詢。
AddOData() 方法呼叫了 GetEdmModel() 方法,該方法用於檢索查詢所使用的資料模型,從而構成 OData 服務的基礎。該服務利用稱為實體資料模型 (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 通過提供一個標準化的協議來簡化 .NET 中的 API 開發,使用 CRUD 操作查詢和操作數據。它遵循 RESTful 的實踐,使用 URL 和 HTTP 動詞,並利用實體數據模型 (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 文檔,然後將其保存為文件。
ODataConventionModelBuilder 在 .NET 中的目的何在?
ODataConventionModelBuilder 在 .NET 中用於使用默認命名約定自動生成實體數據模型 (EDM),減少了定義應用程序中 OData 模型所需的代碼量。
什麼是 .NET 中全面的 PDF 操作庫?
IronPDF 是 C# 中的一個全面的 PDF 操作庫,它可以幫助完成文件轉換為 PDF、拆分和刪除 PDF 頁面以及在 .NET 應用程序中從 HTML 生成 PDF 等任務。
OData 如何提升 .NET 服務的互操作性?
OData 通過允許遵循 OData 標準的客戶端與基於 .NET 的 OData 服務無縫交互,增強了互操作性,促進了不同應用程序和平台之間的更廣泛集成。
在 OData 的上下文中,CRUD 操作是什麼?
在 OData 的上下文中,CRUD 操作指的是創建、閱讀、更新和刪除這些基本操作,這對於在 RESTful API 中操作數據是必不可少的。



