从ASP.Net Web Api OData控制器调用实体的相关对象

时间:2015-06-04 05:29:13

标签: asp.net web-services rest asp.net-web-api odata

我正在为Northwind数据库编写ASP.Net Web Api OData。 这是我在Controller中的方法。

[EnableQuery]
public IQueryable<Order> GetOrdersFromCustomer([FromODataUri] string key)
{
   // return _Context.Orders.Where(o => o.CustomerID == key);
    return _Context.Customers.Where(c => c.CustomerID.Equals(key)).SelectMany(c => c.Orders);
}

这是我在WebApiConfig.cs中的配置代码。

     public static class WebApiConfig
     {
         public static void Register(HttpConfiguration config)
         {
        config.Routes.MapODataRoute("Northwind", "odata", GetImplicitEDM());

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
       }

      private static IEdmModel GetImplicitEDM()
      {
        ODataModelBuilder builder = new ODataConventionModelBuilder();
        builder.EntitySet<Customer>("Customers");
        builder.EntitySet<Order>("Orders");
        return builder.GetEdmModel(); // magic happens here
      }

这是我的Order.cs

  public class Order
  {
    public int OrderID { get; set; }
    public string CustomerID { get; set; }
    public int? EmployeeID { get; set; }
    public DateTime? OrderDate { get; set; }
    public DateTime? RequiredDate { get; set; }
    public DateTime? ShippedDate { get; set; }
    public ICollection<OrderDetail> OrderDetails { get; set; }
  }

这是我的Customer.cs。

    public class Customer
    {
     public string CustomerID { get; set; }
     public string CompanyName { get; set; }
     public string ContactName { get; set; }
     public string Phone { get; set; }
     public string Address { get; set; }
     public string City { get; set; }
     public string PostalCode { get; set; }
     public string Country { get; set; }
     public ICollection<Order> Orders { get; set; }
    }

这是我的请求网址。

http://localhost:21288/odata/Customers( 'ALFKI')/订单

每次调用此请求时,都会收到此异常(状态码500)。我编写并检查所有内容,例如示例代码。但他们的代码完美无缺,而且我的代码不起作用。

"odata.error":{
    "code":"","message":{
      "lang":"en-US","value":"An error has occurred."
    },"innererror":{
      "message":"The 'ObjectContent`1' type failed to serialize the response body for content type 'application/json; odata=minimalmetadata; streaming=true; charset=utf-8'.","type":"System.InvalidOperationException","stacktrace":"","internalexception":{
        "message":"Null collections cannot be serialized.","type":"System.Runtime.Serialization.SerializationException"

我不知道出了什么问题。请帮助我。

1 个答案:

答案 0 :(得分:0)

我认为你的

_Context.Customers.Where(c => c.CustomerID.Equals(key)).SelectMany(c => c.Orders);

无法转换为IQueryable<Order>,因此返回null,并获取异常,请尝试:

_Context.Customers.Where(c => c.CustomerID.Equals(key)).SelectMany(c => c.Orders).AsQueryable();