OData Get方法返回Complex Type

时间:2015-10-29 09:22:34

标签: asp.net-web-api odata

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

有效。

我已经在Google上搜索了一段时间但仍未找到任何内容。如果我们可以做到这一点,或者我们有其他方法可以帮助我,你能帮助我吗?

1 个答案:

答案 0 :(得分:0)

传递给SELECT iif(ArbPlWPos like "IH-MVK*", "IH-MKE", left(ArbPlWPos, 6)), count(*) FROM TABLE GROUP BY iif(ArbPlWPos like "IH-MVK*", "IH-MKE", left(ArbPlWPos, 6)); 的通用参数的类型 - 在您的情况下为builder.EntitySet - 需要匹配从Staff方法返回的对象。由于您使用了Get,因此变量Staff必须属于q类型。

IQueryable<Staff>属性属于这种类型,因此它可以正常工作,但是显然不起作用的版本的匿名类型不是这样,它不起作用。

继续发表评论

  

我想获取包含一些统计数据的员工信息列表

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

但是,您在示例中所做的事情似乎只是返回Select对象上已有的属性。您可以使用OData Staff语句来执行此操作。例如:

$select