跳過到頁腳內容
.NET幫助

OData C#(對開發者如何理解的工作)

開放數據協議(OData)簡化了在 Microsoft .NET 開發中構建和使用 RESTful API。 它提供了一種標準化的方法來通過熟悉的 CRUD(創建、讀取、更新、刪除)操作查詢和操作數據。 本文探討了開放數據協議如何簡化 .NET 中的 API 開發,提供示例並強調其關鍵優勢。 要了解更多關於 OData 的信息,您可以查看 OData C# GitHub Repo 以獲取源代碼。

OData C#(對開發者的運作方式):圖 1 - OData C#-數據訪問協議

OData 遵循構建 RESTful Web API 的標準做法,使用 URL 和 HTTP 動詞(如 GET 和 POST)來定義操作。 它使用實體數據模型(EDM)和 JSON 或 AtomPub 進行消息編碼。 雖然與 GraphQL 相比 OData 簡化了 API 開發,但它可能提供更少的高級功能。

OData C#(對開發者的運作方式):圖 2 - OData

在 .NET 中使用 OData 的好處

  • 標準化: OData 擬定了一種一致的方法來定義實體數據模型、處理請求和格式化響應。 這降低了開發的複雜性,並簡化了客戶端應用程序的集成。
  • 豐富的查詢功能: OData 支持統一的查詢方式以執行 CRUD 操作、過濾($filter)、排序(升序/降序)($orderby) 和分頁($top,$skip)功能,允許客戶端有效檢索特定數據集。
  • 改善的開發者體驗: .NET 用於 OData 的庫簡化了 API 開發。 開發人員可以利用預構建的元件進行路由、查詢處理和數據序列化,減少代碼重複和開發時間。
  • 互操作性: 符合 OData 的客戶端可以輕鬆地與基於 .NET 的 OData 服務交互,促進更廣泛的應用集成。

在 .NET Framework 中入門 OData

.NET 用於 OData 的庫提高了開發者的體驗,提供了有效的方法來操作數據集。 它簡化了在 .NET 開發中構建和使用 RESTful API。 它提供了一種標準化的方法來通過熟悉的 CRUD 操作(創建、讀取、更新、刪除)查詢和操作數據。

在 .NET 專案中設置 OData

首先在 Visual Studio 中打開您的新項目。 然後,導航到解決方案資源管理器,右鍵單擊您的項目,然後選擇 "管理 NuGet 套件"。 搜尋 Microsoft.AspNetCore.OData 並安裝它。 當前的 OData 版本是 8.2.5。

要在 NuGet 包管理控制台中安裝 OData,請使用以下命令。

Install-Package Microsoft.AspNetCore.OData

OData C#(對開發者的運作方式):圖 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 中設置 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 對象靜態列表。 Get 方法裝飾有 [EnableQuery],允許客戶端對產品列表執行 OData 查詢(過濾、排序、分頁),並將結果作為 HTTP GET 請求的 IActionResult 返回。

在 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 服務,包括啟用選擇、過濾、排序、計數、擴展並設置查詢結果的最大頂部值為 20。 這一設置確保應用能夠有效處理 OData 查詢。

AddOData() 方法使用 GetEdmModel() 方法檢索用於查詢的數據模型,這是 OData 服務的基礎。該服務使用一個名為實體數據模型(EDM)的抽象數據模型來定義暴露的數據。 ODataConventionModelBuilder 類使用默認命名約定創建 EDM,最大限度地減少代碼需求。 或者,開發者可以利用 ODataModelBuilder 類以獲得對 EDM 的更多控制。

代碼截圖

OData C#(對開發者的運作方式):圖 4 - Visual Studio 中的代碼

運行服務

運行服務後,您可以使用各種 OData 查询选项來查詢該服務,如:

https://localhost:7131/odata/Service

程序输出

OData C#(對開發者的運作方式):圖 5 - OData 服務輸出

IronPDF 简介

IronPDF is a comprehensive C# library designed to simplify the conversion of files to PDF, splitting of PDF pages, and removal of pages from PDF within .NET applications. 它提供了廣泛的功能,包括從 HTML、CSS、圖片和 JavaScript 生成 PDF,使開發者能夠輕鬆地將 Web 内容轉換為高品質的 PDF 文檔。 憑借其直觀的 API 和強大的渲染引擎,IronPDF 為開發人員提供了精簡 PDF 生成過程的能力,便捷地把動態文檔生成功能集成到他們的應用程式中。

OData C#(對開發者的運作方式):圖 6 - IronPDF

將 IronPDF 添加到專案中

要在 Visual Studio 中安裝 IronPDF,請導航到 NuGet Package Manager Console,並使用以下命令。

Install-Package IronPdf

生成 PDF

要從 HTML 内容生成在 .NET 應用程式中的 PDF 文檔,我們可以使用像 DinkToPdf 或類似的庫中的 ChromePdfRenderer 類。 此示例展示了如何創建包含員工記錄詳細信息的 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

此示例創建了一個簡單的 員工 記錄,然後使用 IronPDF 生成顯示該人員姓名的 PDF 文檔。 它展示了如何無縫地將 C# 記錄與 PDF 生成集成在 .NET 應用程序中。

OData C#(對開發者的運作方式):圖 7 - PDF 輸出

結論

OData 通過提供標準化的查詢和操作功能,簡化了 .NET 中的 RESTful API 開發和消費。 我們還可以將其與實體框架集成,提高開發效率,簡化數據訪問和管理。 OData 簡化了 API 開發,通過其豐富的查詢功能和改善的開發者體驗,實現了跨平台的無縫集成和互操作性。 此外,IronPDF 提供了全面的功能和支持 robust 的 .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 圖片-based 的 OData 服務,提升了更廣泛的應用程序和平台集成。

在 OData 的上下文中,CRUD 操作是什麼?

在 OData 的上下文中,CRUD 操作指的是創建、閱讀、更新和刪除這些基本操作,這對於在 RESTful API 中操作數據是必不可少的。

Curtis Chau
技術作家

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

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