2015-06-04 3 views
1

Я пишу 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" 

Я не знаю, что не так. PLZ помочь мне.

+0

Я получаю то же сообщение об ошибке. Вам удалось найти причину? – JonathanPeel

ответ

0

Я думаю, что ваш

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

не может преобразовать в IQueryable<Order>, поэтому возвращать нуль, и получить исключение, попробуйте:

_Context.Customers.Where(c => c.CustomerID.Equals(key)).SelectMany(c => c.Orders).AsQueryable(); 
Смежные вопросы