Web API $ extend具有过滤器的IQueryable

罗迪·范·桑比克

我有一个设置,可以在其中获得返回以下内容的WebApi OData服务:客户。返回客户的代码是:

public IHttpActionResult GetCustomers(ODataQueryOptions<Customer> queryOptions)
{
    return Ok(context.Customers.Where(i => i.IsActive).AsQueryable());
}

因此,GetCustomers方法返回所有活动客户的IQuerable结果。出于历史目的,我们将所有客户保留在数据库中,但是当删除客户时,我们将IsActive字段设置为false。

使用简单的builder.EntitySet创建OData设置,以构建实体的Url。

EntitySetConfiguration<Customer> customers = builder.EntitySet<Customer>("customers");

这完美无瑕。我有一个Angular前端,它使用$ http调用来接收客户,等等。

但是,客户可以在数据库中包含相关联系人。要在Angular前端中获取联系人,我使用OData的$ extend功能:

odata/customers?$expand=contacts

这也很好。我收到所有相关联系人的客户。但是,正如您所猜测的,我只想接收具有IsActive的联系人。而且IQueryable功能可以将所有结果返回给我。

我知道我可以使用单独的Odata调用来获取联系人,但是我真的很想使用$ expand功能来在一次调用中获取所有数据。我知道我也可以在客户端进行过滤(使用:$ filter)。但我想在WebApi部分中正确设置此设置,因此客户端不必担心过滤掉不活动的结果。

我似乎无法弄清楚如何正确实现这一目标。有人可以帮助我走上正确的道路吗?

格特·阿诺德

EntityFramework.DynamicFilters是我所知道的最强大的Entity Framework工具之一。它跳入了经常被要求但直到EF6却从未实现过的filters功能的空白Incude它依靠EF的侦听API,在暴露非常简单的界面的同时,还完成了繁琐的修改表达式的工作。

在您的情况下,您可以执行以下操作:

using EntityFramework.DynamicFilters;

// In OnModelCreating (DbContext)
modelBuilder.Filter("CustomerActive", (Customers c) => c.IsActive);

就这样!现在,无论在哪里Customers查询,无论是直接通过导航属性还是在Includes中,谓词都将添加到查询中。

您要所有客户吗?您只需执行以下操作,即可针对每个上下文实例关闭过滤器

context.DisableFilter("CustomerActive");

到目前为止,我只发现了一个小故障(或警告)。如果有两个实体,Parent并且Child有一个Parent不返回任何记录的过滤器,则此查询...

context.Children.Include(c => c.Parent)

...不返回任何内容。但是,从查询的形状来看,我希望它返回Child具有空父母的实体。

这是因为在SQL存在INNER JOIN之间Parent以及Child和谓词Parent计算结果为falseAnOUTER JOIN会给出预期的行为,但是当然我们不能要求该库这么聪明。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Web API中具有多个过滤器的执行顺序

来自分类Dev

具有全局Web API过滤器属性的Unity依赖项注入

来自分类Dev

Web API中具有多个过滤器的执行顺序

来自分类Dev

Python Web抓取带有过滤器的表

来自分类Dev

带有过滤器的Django rest框架API

来自分类Dev

无法读取Web API操作过滤器的内容

来自分类Dev

Web Audio API-删除过滤器

来自分类Dev

ASP.NET Web API授权过滤器

来自分类Dev

Web Audio API 24db过滤器

来自分类Dev

Web Audio API-删除过滤器

来自分类Dev

Web API 过滤器立即发送错误响应

来自分类Dev

web api 2.0过滤器实现customFilter的最佳选择

来自分类Dev

制作一次可同时应用所有过滤器的API

来自分类Dev

具有日期范围的tcms api过滤器

来自分类Dev

带有过滤器的HTML5网络音频API Wavesurfer.js

来自分类Dev

Autofac Web Api过滤器-在运行时声明

来自分类Dev

自定义操作过滤器中的Web API访问路由模板

来自分类Dev

从Asp.net Web API 2过滤器属性响应返回JSON的正确方法

来自分类Dev

如何知道将从Web API授权过滤器中调用哪种控制器方法

来自分类Dev

Web API自定义身份验证过滤器

来自分类Dev

在Web API身份验证过滤器中捕获请求IP地址

来自分类Dev

HTML5 Web Audio API:过滤器不起作用

来自分类Dev

将变量从Web API控制器方法传递到过滤器

来自分类Dev

Web API动作过滤器可处理空集和404

来自分类Dev

自定义动作过滤器统一依赖注入Web API 2

来自分类Dev

处理程序的ASP.NET Web API覆盖授权过滤器

来自分类Dev

如何使用Web API中的过滤器通过错误消息传递状态

来自分类Dev

MVC Web API路由配置-路由模板中的过滤器控制器

来自分类Dev

动作过滤器中的ASP.NET Web API读取模型

Related 相关文章

热门标签

归档