This question非常相似,但不能满足我的需要。
我正在使用Entity Framework 6.我的数据库有两个表,Customers和CustomerTypes。我为每个人创建了一个ViewModel。客户可以拥有类型:
public class Customer
{
public int CustomerID { get; set; }
public string CustomerName { get; set; }
public CustomerTypeViewModel CustomerType { get; set; }
}
public class CustomerTypeViewModel
{
public int CustomerTypeID { get; set; }
public string CustomerTypeDescription { get; set; }
}
我有一个Customer控制器,它公开了一个返回类型为IQueryable的odata动作方法:
[HttpPost, Queryable(AllowedQueryOptions = AllowedQueryOptions.All)]
public IQueryable<CustomerViewModel> GetCustomersMatchingCriteria([FromBody]ODataActionParameters parameters)
{
var criteria = (CustomerMassUpdateCriteriaViewModel)parameters["Criteria"];
return Common.Customers.GetCustomerMassUpdateCriteriaResults(criteria,
ConfigurationManager.AppSettings["CLIENT_ID"]).Select(
c => new CustomerViewModel()
{
CustomerID = c.CustomerID,
CustomerName = c.CustomerName,
CustomerType = new CustomerTypeViewModel()
{
CustomerTypeDescription = c.CustomerType.CustomerTypeDescription
}
});
}
Common.Customers.GetCustomerMassUpdateCriteriaResults方法只返回Customer的IQueryable,它是实际的实体。
问题是,当使用以下查询字符串选项调用此控制器方法时:
$expand=CustomerType
$select=CustomerID,CustomerName,CustomerType/CustomerTypeDescription
抛出此异常:
'ObjectContent`1'类型无法序列化内容类型的响应正文 “应用程序/ JSON;字符集= UTF-8' “” 类型 “:” System.InvalidOperationException“
DbIsNullExpression的参数必须引用基元,枚举或引用类型。
从$ select列表中删除$ expand选项和关联的CustomerType / CustomerTypeDescription属性不会产生错误。
我觉得我在这里遗漏了一些明显的东西。有什么想法吗?
第一次编辑:
通过ToList()扩展方法枚举结果并返回IEnumerable而不是IQueryable成功扩展了CustomerType导航属性,但我的ODATA $选择列表在数据库级别不再受到尊重。这不是打败了使用ODATA的目的吗?
答案 0 :(得分:0)
例外:
'ObjectContent`1'类型无法序列化响应正文 内容类型'application / json; 字符集= UTF-8' “” 类型 “:” System.InvalidOperationException“
据我所知,这是由于请求如何达到OData格式。请求应该到OData路由进行格式化。如果你可以在global.asax中的 RouteConfig.RegisterRoutes 和 WebApiConfig.Register 之前移动 GlobalConfiguration.Configuration.EnableOData()。