OData Get方法返回Complex Type



我刚开始使用Asp.Net Web API的OData。

我在WebApiConfig.cs 中声明

ODataModelBuilder builder = new ODataConventionModelBuilder();
builder.EntitySet<Staff>("staffs");
return builder.GetEdmModel();

在StaffsController.cs 中

public class StaffsController : ODataController
{
    UnitOfWork unitOfWork;
    public StaffsController()
    {
        this.unitOfWork = new UnitOfWork();
    }
    [EnableQuery]
    public IHttpActionResult Get()
    {
        var q = this.unitOfWork.StaffRepository.Data.Select(p => new { p.Name, p.Id, p.Ext });
        // Or Grouping here to return a Complex Type                   
        return Ok(q);
    }
}

它返回406错误,但如果我更改

var q = this.unitOfWork.StaffRepository.Data.Select(p => new { p.Name, p.Id, p.Ext });
// Or Grouping here to return a Complex Type

var q = this.unitOfWork.StaffRepository.Data;

它有效。

我在谷歌上搜索了一段时间,但还是一无所获。如果我们能做到,或者我们有其他方法可以做到,你能帮我吗?

传递到builder.EntitySet的泛型参数中的类型(在您的情况下为Staff)需要与从Get方法返回的对象匹配。因为使用了Staff,所以变量q的类型需要为IQueryable<Staff>

Data属性是这种类型的,所以它可以工作,但不工作的版本的匿名类型显然不工作,所以它不工作。

根据您的评论

我想得到一些统计数据的员工信息列表

为了向响应添加不同的属性,您需要创建一个新的对象类型,将其传递到builder.EntitySet泛型参数中,然后在控制器的Select语句中创建它。

然而,您在示例中所做的似乎只是返回Staff对象上已经存在的属性。您可以使用OData $select语句来执行此操作。例如:

http://yoururl/staffs?$select=Name,Id,Ext

相关内容

最新更新