- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
有 2 个类,Foo 和 Bar。在 Foo 对象中嵌套了一个 Bar 对象。
public class Foo {
public Guid FooId { get; set; }
public string FooName { get; set; }
[ForeignKey("Bar")]
public Guid BarId { get; set; }
public virtual Bar Bar { get; set; }
}
public class Bar {
public Guid BarId { get; set; }
public string BarName { get; set; }
}
public class FooBarContext : DbContext {
public DbSet<Foo> Foos { get; set; }
public DbSet<Bar> Bars { get; set; }
}
public class FooDTO {
public Guid FooId { get; set; }
public string FooName { get; set; }
public Guid BarId { get; set; }
public string BarName { get; set; }
}
我的问题是:我能否以某种方式将 FooDTO 的 OData 查询转换为 Foo 的 OData 查询,以便它可以应用于 Foos DbSet?
例如,我想通过 BarName 查询,它最终来自嵌套的 Bar 对象。
GET /Foos?$filter=BarName eq 'Bar2'
这是处理查询的 Controller 和 Action
public class FoosController {
public async Task<IHttpActionResult> GetFoos(ODataQueryOptions<FooDTO> queryOptions) {
// translate filter FooDTO.BarName to filter Foo.Bar.Name
// ODataQueryOptions<Foo> fooQueryOptions = ....
using (var context = new FooBarContext()) {
return fooQueryOptions.ApplyTo(context.Foos);
}
}
}
谢谢。
最佳答案
首先将 OData 包安装到您的 Web API 项目中
Install-Package Microsoft.AspNet.OData -Version 7.1.0
通过添加以下 using
语句在 WebApiConfig.cs
中配置 OData 端点
using System.Web.OData.Builder;
using System.Web.OData.Extensions;
然后是 Register
方法的代码
public static void Register(HttpConfiguration config)
{
config.MapHttpAttributeRoutes();
// New code start
ODataModelBuilder builder = new ODataConventionModelBuilder();
builder.EntitySet<Foo>("Foos");
builder.EntitySet<Bar>("Bars");
config.MapODataServiceRoute(
routeName: "ODataRoute",
routePrefix: null,
model: builder.GetEdmModel());
config.Count().Filter().OrderBy().Expand().Select().MaxTop(null);
config.EnableDependencyInjection();
// New code end
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
针对映射进行了更新:在您的 Controller 中
[EnableQuery()] // Enables clients to modify the query, by using query options such as $filter, $sort, and $page
public async Task<IHttpActionResult> GetFoos(ODataQueryOptions<FooDTO> queryOptions)
{
using (var context = new FooBarContext())
{
return queryOptions.ApplyTo(context.Foos.AsQueryable().Select(f => new FooDTO
{
BarId = f.BarId,
BarName = f.Bar.BarName,
FooId = f.FooId,
FooName = f.FooName
}));
}
}
查看更多Create an OData v4 Endpoint Using ASP.NET Web API ,
还有 Supercharging your Web APIs with OData and ASP.NET Core (对于 .Net 核心,但它可能有所帮助)
关于c# - 如何将 DTO 的 ODataQueryOptions 应用于底层 EntitySet?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34285036/
我有一个可用的(简化的)ODataController,方法如下。 public class MyTypeController : ODataController { [HttpGet] [E
在尝试进行一些测试驱动开发时,我创建了最基本的可构建方法: public class NoteService : INoteService { public IEnumerable GetNo
我有一个常规 Controller ,它具有 odata 功能: [Route("[controller]")] public class ChannelsController : Controlle
我是为 WebAPI 编写测试用例的新手。我曾经看到过类似的问题,但没有得到回答,但我想知道如果我的 API 有 ODataQueryOptions,我将如何测试它们。作为参数的一部分。见下文: pu
我正在尝试通过 EF Core 和 OData(7.1.0) 实现对 Sql Server 的查询。 操作方法如下: [HttpGet] public IEnumerable Get(ODataQue
我需要能够从 ODataQueryOptions 进行转换至 RestRequest为了能够发出带有指定过滤器的 RestRequest,并创建了以下辅助类: public static class
我正在实现一个 Web API 接口(interface)来支持一些相当复杂的查询来运行它,并且遇到了最大请求 URI 长度的问题。 我的 Web API 方法的定义如下所示(使用 Automappe
更新 投票here on User Voice解决歧义。 我编写了一个继承于 ODataController 的 OData WebAPI Controller 。 . public class Ma
最近我们决定使用包 Microsoft.AspNetCore.OData为我们的服务解决方案。这些服务具有 ODataQueryOptions 参数,并使用它来过滤它们提供的数据。为了对此进行单元测试
我有一个 Web API 项目,在没有 OData 支持的情况下使用了很多年,只有标准的 URL 参数。 我现在希望向该 API 添加 OData 支持,但由于该 API 不是基于可查询模型构建的,因
我正在构建一个 OData v.4 Web 服务,该服务必须公开从另一个第 3 方 Web 源检索的数据,因此数据与 LINQ 世界中的任何内容都不相似,即:没有 IQueryable,没有上下文,没
我正在构建一个 OData v.4 Web 服务,该服务必须公开从另一个第 3 方 Web 源检索的数据,因此数据与 LINQ 世界中的任何内容都不相似,即:没有 IQueryable,没有上下文,没
有 2 个类,Foo 和 Bar。在 Foo 对象中嵌套了一个 Bar 对象。 public class Foo { public Guid FooId { get; set; } p
问题开始here ,我无法调用 $select或 $expand在 results . 给定: var results = options.ApplyTo(_uow.Repos
我们将 Microsoft ASP.NET MVC OData WebAPI 用于我们的 Web 服务。由于围绕层次结构 ID 的一些数据架构问题(超出本次对话的范围),我们的一些 GET 操作必须使
我在 OData v4 中使用 ApiController(不是 ODataController),其中有一个将 ODataQueryOptions 作为参数的 Get 操作,如下所示: public
我尝试了使用 Breeze 和 API Controller 、使用过滤器(部分使用自定义对象,另一部分使用 ODataQueryOptions)加载项目列表的不同方法,但结果证明它们都不是真正成功的
我想重建我的上一个项目。过去,我没有使用任何 Web API。我可以使用 ODataQueryOptions 来执行 $filter、$orderby 、$top 、$skip 操作吗对于我自己的 h
我正在将我们现有的 API 迁移到 .net 5,我面临单元测试迁移的问题。我想保留测试和测试 Controller ,但我找不到处理 ODataQueryOptions 的方法,因为此类已更改,我再
我正在将我们现有的 API 迁移到 .net 5,我面临单元测试迁移的问题。我想保留测试和测试 Controller ,但我找不到处理 ODataQueryOptions 的方法,因为此类已更改,我再
我是一名优秀的程序员,十分优秀!