如何在C# Core控制台应用中使用OData查询本地内存数据?
支持本地内存对象查询的OData库
微软官方的OData生态提供了完全脱离Web场景的独立组件,可以直接在控制台应用中解析OData查询字符串,转换为可作用于内存集合的LINQ查询,不需要依赖任何ASP.NET Core相关组件。
需要安装的NuGet包
仅需安装以下三个独立包即可:
Microsoft.OData.Core:OData核心协议实现Microsoft.OData.ModelBuilder:EDM模型构造组件,无需依赖Web环境Microsoft.OData.Linq:OData查询到LINQ表达式的转换组件
基础使用示例
- 首先定义你的业务实体类
public class Employee { public int Id { get; set; } public string Name { get; set; } public int Age { get; set; } public string Department { get; set; } }
- 构造实体对应的EDM模型(OData查询的元数据依据)
var modelBuilder = new ODataModelBuilder(); var employeeType = modelBuilder.EntityType<Employee>(); employeeType.HasKey(e => e.Id); employeeType.Property(e => e.Name); employeeType.Property(e => e.Age); employeeType.Property(e => e.Department); modelBuilder.EntitySet<Employee>("Employees"); var edmModel = modelBuilder.GetEdmModel();
- 解析OData查询并作用于内存集合
假设你已有内存数据源,需要执行的OData查询字符串为$filter=Age ge 20 and Department eq '研发部'&$orderby=Age desc&$top=10
// 模拟内存数据源 IQueryable<Employee> employees = new List<Employee> { new Employee { Id = 1, Name = "张三", Age = 22, Department = "研发部" }, new Employee { Id = 2, Name = "李四", Age = 19, Department = "研发部" }, new Employee { Id = 3, Name = "王五", Age = 27, Department = "市场部" }, new Employee { Id = 4, Name = "赵六", Age = 25, Department = "研发部" } }.AsQueryable(); // 解析OData查询字符串 var oDataUriParser = new ODataUriParser(edmModel, new Uri("Employees", UriKind.Relative), new Uri(odataQueryStr, UriKind.Relative)); // 解析过滤条件 var filterClause = oDataUriParser.ParseFilter(); var filterExpr = filterClause.ToExpression<Employee>(); var query = employees.Where(filterExpr); // 解析排序条件 var orderByClause = oDataUriParser.ParseOrderBy(); query = orderByClause.ApplyTo(query) as IQueryable<Employee>; // 解析分页条件 var top = oDataUriParser.ParseTop(); if (top.HasValue) query = query.Take(top.Value); var skip = oDataUriParser.ParseSkip(); if (skip.HasValue) query = query.Skip(skip.Value); // 执行查询得到结果 var result = query.ToList();
能力说明
- 支持所有OData标准查询语法:
$filter、$orderby、$select、$expand、$skip、$top、$count等,能力和Web场景下的OData完全一致 - 可根据需求单独解析某一类查询条件,不需要每次都构造完整的查询逻辑
- 所有组件都基于.NET Standard实现,完全兼容.NET Core/.NET 5+的控制台应用
内容的提问来源于stack exchange,提问作者quillbreaker
相关产品推荐
相关产品推荐

