OData C#(开发者用法)
开放数据协议 (OData) 简化了 Microsoft .NET 开发中的 RESTful API 的构建和使用。 它提供了一种标准化的方法,通过熟悉的 CRUD(创建、读取、更新、删除)操作来查询和操作数据。 本文探讨了开放数据协议如何在 .NET 中简化 API 开发,提供示例并突出了其关键优势。 要了解更多关于 OData 的信息,您可以查看 OData C# GitHub 库 的源代码。

OData 遵循构建 RESTful Web API 的标准实践,使用 URL 和 HTTP 动词如 GET 和 POST 来定义操作。 它使用实体数据模型 (EDM) 和 JSON 或 AtomPub 进行消息编码来表示数据。 虽然与 GraphQL 相比,OData 简化了 API 开发,但可能提供的高级功能较少。

在 .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,请使用以下命令。

示例:在 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 Property Id As Integer
Public Property FirstName As String
Public Property Price As Decimal
End ClassPublic 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 NamespaceImports 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,可以使用OData协议查询和操作数据。 它将请求路由到Service对象提供静态列表,包括一台笔记本电脑和一部智能手机。 装饰有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())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实例。 Service实体的实体集。 然后调用AddOData方法以配置OData服务,包括启用select、filter、order by、count、expand,并为查询结果设置最大TOP值为20。 这种设置确保应用能够有效处理 OData 查询。
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 文档。 凭借其直观的 API 和强大的渲染引擎,IronPDF 使开发人员能够简化 PDF 生成过程,从而轻松将动态文档生成功能集成到其应用中。

将 IronPDF 添加到项目中
要在 Visual Studio 中安装 IronPDF,请导航至 NuGet 包管理器控制台,并使用以下命令。
生成 PDF
要在.NET应用程序中从HTML内容生成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'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本示例创建一个简单的员工记录,然后使用 IronPDF 生成显示该人姓名的 PDF 文档。 它展示了 C# 记录如何无缝地与 .NET 应用程序中的 PDF 生成集成。

结论
OData 通过提供标准化的查询和操作能力简化了 .NET 中的 RESTful API 的开发和使用。 我们还可以将其与Entity Framework集成,通过简化数据访问和管理来提高开发效率。 OData 简化了 API 开发,使其丰富的查询功能和改善的开发人员体验实现跨各种平台的无缝集成和互操作性。 此外,IronPDF 提供了全面的功能和对 .NET 应用中强大 PDF 操作的支持。
Jacob Mellor 是 Iron Software 的首席技术官,也是一位开创 C# PDF 技术的有远见的工程师。作为 Iron Software 核心代码库的原始开发者,他从公司成立之初就开始塑造公司的产品架构,与首席执行官 Cameron Rimington 一起将公司转变为一家拥有 50 多名员工的公司,为 NASA、特斯拉和全球政府机构提供服务。