我刚开始使用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