4

OData WebAPI实践-Non-EDM模式 - 波多尔斯基

 1 year ago
source link: https://www.cnblogs.com/podolski/p/17395382.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

本文属于OData系列文章

前文说到了 EDMOData 之间的关系,具有 EDMOData 提供了强大的查询能力,但是 OData 并不必须要配置 EDM,我们也可以使用 Non-EDM 方案。

Non-EDM

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

配置 OData 就可以不需要在内配置 GetEdmModel()。当然,如果你需要配置路由,因为函数参数需要,我们可以返回一个默认的空 EDM。

            services.AddControllers()
                .AddOData(opt => opt.Count().Filter().Expand().Select().OrderBy().SetMaxTop(5)
                );

为了实现 OData 的功能,我们依然需要给控制器与函数上增加一些配置:

	[ApiController]
    [Route("api/[controller]")]
    public class AccountsController : ControllerBase
    {
        [HttpGet]
        public IActionResult Get(ODataQueryOptions<Account> queryOptions)
        {
            var querable = accounts.AsQueryable<Account>();
            var finalQuery = queryOptions.ApplyTo(querable);
            return Ok(finalQuery);
        }

        [HttpGet("{id}")]
        public IActionResult Get(Guid id, ODataQueryOptions<Account> queryOptions)
        {
            var accountQuery = accounts.Where(c => c.AccountId == id);
            if (!accountQuery.Any())
            {
                return NotFound();
            }

            var finalQuery = queryOptions.ApplyTo(accountQuery.AsQueryable<Account>()) as IQueryable<dynamic>;
            var result = finalQuery.FirstOrDefault();

            if (result == null)
            {
                return NotFound();
            }

            return Ok(result);
        }
    }

这里代码使用了 ODataQueryOptions,因此没有使用 [EnableQuery]

我们查看 OData 路由,Account 不在路径中了。

image

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

image

细心的同学发现:

  • 我使用了 $count,但是返回的内容并没有计数结果。
  • 返回对象中没有 @odata.context 指示对应实体的 EDM 配置信息。
  • 在定义了 OData EDM 的对象中,返回数组类型是 "Value":[] 的形式,而没有定义 EDM 的对象会直接返回数组对象,这个在与前端进行交互的过程中需要特别注意。

不使用 EDM 模式,在使用 OData 查询时还是有很多限制:

  • 类似$count 之类的语句暂时还不支持。
  • 不支持复杂对象(ComplexType)的 $select。
  • 无法配置 EntityType 的 Ignore ,不支持一些 OData 的高级特性。
  • 不能实现 OData Routing 映射,可能会造成 Versioning 之类的操作困难。

因此,还是建议在使用 OData 时使用并正确配置 EDM,这样可以获得最全面的 OData 特性支持。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK