我正在为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"
我不知道出了什么问题。请帮助我。
答案 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();