【问题标题】:how do I use the $select from ODataQueryOptions with a seporate data layer?如何将 ODataQueryOptions 中的 $select 与单独的数据层一起使用?
【发布时间】:2015-08-18 09:10:26
【问题描述】:

我正在尝试让 ODataQueryOptions 的 $select 部分与我的业务层一起使用,但我似乎无法解决问题(仅供参考:将 EF 查询放在我的控制器中不是一个选项)..

这是我的 ODataController 方法

public async Task<IHttpActionResult> Get(Guid propertyId, ODataQueryOptions<HighSchoolViewModel> odataOptions)
    {
        // validate the query.
        try
        {
            odataOptions.Validate(_validationSettings);
        }
        catch (ODataException ex)
        {
            return BadRequest(ex.Message);
        }

        IEnumerable<HighSchoolViewModel> returnData = await _service.ODataSearchAsync(propertyId, odataOptions);
        return Ok<IEnumerable<HighSchoolViewModel>>(returnData);
    }

这是我的业务层/方法

public async Task<IEnumerable<HighSchoolViewModel>> ODataSearchAsync(Guid propertyId, ODataQueryOptions<HighSchoolViewModel> queryOptions)
        {
            using (DbContext context = new LAMSContext())
            {
                var query = queryOptions.ApplyTo(context.PropertyHighSchools.Where(hs => hs.PropertyId == propertyId)
                     .Project().To<HighSchoolViewModel>());
                return await ((IQueryable<HighSchoolViewModel>)query).ToListAsync();
            }
        }

这适用于除 $select 之外的所有内容(可能是扩展,但这是“超出范围”)。

显然,当 ApplyTo() 运行时,它会将 IQueryable 更改为返回匿名类型,并且在执行查询时会崩溃。所以我尝试返回一个 IEnumerable,这样类型就无关紧要了,但是当我这样做时,OData 似乎无法处理它并开始吐出 406 错误。

【问题讨论】:

    标签: odata asp.net-web-api2


    【解决方案1】:

    在您的场景中,更改您的控制器固有形式 ApiController,并返回

    result.AsQueryable();
    

    这可能是$select 的解决方法。

    【讨论】:

    • 这是教科书的答案,不幸的是,它假设我的业务层实际上只是 EF,我在 Web.API 层中直接与它连接,而不是在可重用业务程序集的下一层。跨度>
    猜你喜欢
    • 2014-06-04
    • 1970-01-01
    • 2021-04-15
    • 2013-03-19
    • 1970-01-01
    • 2016-02-17
    • 2014-11-12
    • 2010-10-23
    • 1970-01-01
    相关资源
    最近更新 更多