ToB企服应用市场:ToB评测及商务社交产业平台

标题: OData WebAPI实践-Non-EDM模式 [打印本页]

作者: 傲渊山岳    时间: 2023-5-12 20:39
标题: OData WebAPI实践-Non-EDM模式
本文属于OData系列文章
前文说到了 EDM  与 OData 之间的关系,具有 EDM 的 OData 提供了强大的查询能力,但是 OData 并不必须要配置 EDM,我们也可以使用 Non-EDM 方案。
Non-EDM

所谓 Non-EDM ,并不是说在 OData 运行时不需要 EDM 配置了,而是由 OData 动态生成的 EDM,进而实现 OData 功能。
配置

配置 OData 就可以不需要在内配置 GetEdmModel()。当然,如果你需要配置路由,因为函数参数需要,我们可以返回一个默认的空 EDM。
  1.             services.AddControllers()
  2.                 .AddOData(opt => opt.Count().Filter().Expand().Select().OrderBy().SetMaxTop(5)
  3.                 );
复制代码
控制器

为了实现 OData 的功能,我们依然需要给控制器与函数上增加一些配置:
  1.         [ApiController]
  2.     [Route("api/[controller]")]
  3.     public class AccountsController : ControllerBase
  4.     {
  5.         [HttpGet]
  6.         public IActionResult Get(ODataQueryOptions<Account> queryOptions)
  7.         {
  8.             var querable = accounts.AsQueryable<Account>();
  9.             var finalQuery = queryOptions.ApplyTo(querable);
  10.             return Ok(finalQuery);
  11.         }
  12.         [HttpGet("{id}")]
  13.         public IActionResult Get(Guid id, ODataQueryOptions<Account> queryOptions)
  14.         {
  15.             var accountQuery = accounts.Where(c => c.AccountId == id);
  16.             if (!accountQuery.Any())
  17.             {
  18.                 return NotFound();
  19.             }
  20.             var finalQuery = queryOptions.ApplyTo(accountQuery.AsQueryable<Account>()) as IQueryable<dynamic>;
  21.             var result = finalQuery.FirstOrDefault();
  22.             if (result == null)
  23.             {
  24.                 return NotFound();
  25.             }
  26.             return Ok(result);
  27.         }
  28.     }
复制代码
这里代码使用了 ODataQueryOptions,因此没有使用 [EnableQuery]。
我们查看 OData 路由,Account 不在路径中了。

但是我们还是可以使用 OData 语法来进行查询:

细心的同学发现:
限制

不使用 EDM 模式,在使用 OData 查询时还是有很多限制:
因此,还是建议在使用 OData 时使用并正确配置 EDM,这样可以获得最全面的 OData 特性支持。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4