C# 在WebAPI和ViewModel中使用ODATA$expand查询选项
非常相似,但没有满足我的需要 我使用的是实体框架6。我的数据库有两个表,Customers和CustomerTypes。我已经为每个视图创建了一个ViewModel。客户可以具有以下类型:C# 在WebAPI和ViewModel中使用ODATA$expand查询选项,c#,entity-framework,asp.net-web-api,odata,asp.net-mvc-viewmodel,C#,Entity Framework,Asp.net Web Api,Odata,Asp.net Mvc Viewmodel,非常相似,但没有满足我的需要 我使用的是实体框架6。我的数据库有两个表,Customers和CustomerTypes。我已经为每个视图创建了一个ViewModel。客户可以具有以下类型: public class Customer { public int CustomerID { get; set; } public string CustomerName { get; set; } public CustomerTypeViewModel CustomerType
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; }
}
我有一个客户控制器,它公开了一个odata操作方法,返回类型为IQueryable:
[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
}
});
}
将引发此异常:
ObjectContent“1”类型未能序列化内容类型的响应正文
'应用程序/json;字符集=utf-8.,“类型”:“System.InvalidOperationException”
DbIsNullExpression的参数必须引用基元、枚举或引用类型
从$select列表中删除$EXPLAND选项和关联的CustomerType/CustomerTypeDescription属性不会产生错误
我觉得我错过了一些明显的东西,有什么想法吗
第一次编辑:
通过ToList()扩展方法枚举结果并返回IEnumerable而不是IQueryable成功地扩展了CustomerType导航属性,但我的ODATA$select列表在数据库级别不再受尊重。这是否违背了使用ODATA的目的?异常:
ObjectContent“1”类型未能序列化的响应正文
内容类型'application/json;
字符集=utf-8.,“类型”:“System.InvalidOperationException”
据我所知,这是由于请求如何达到OData格式。请求应到达OData路由进行格式化。如果您可以将GlobalConfiguration.Configuration.EnableOData()移到RouteConfig.RegisterRoutes和webapicConfig.Register in global.asax之前,则会有所帮助。据我所知,Queryable(AllowedQueryOptions=AllowedQueryOptions.All)属性应该在更局部的级别上做同样的事情,但我尝试了您的建议,并发现EnableOData()方法不是GlobalConfiguration.Configuration的成员。也许它在WebAPI 5.0中不可用?您最终找到了解决方案吗?我还在努力解决这个问题。@Josh,不,我没有。我最终做的是为我的需要创建一个更具体的viewmodel(或dto或任何您的案例)。我需要访问嵌套属性的属性,如果能使用“$expand”就好了,但结果我只是将该属性粘贴在主viewmodel上,并放弃了“$expand”选项和嵌套属性。由于这个原因,我不得不从架构上重新考虑一些事情,我不太喜欢这个解决方案,但显然这是我目前唯一的选择。
$expand=CustomerType
$select=CustomerID,CustomerName,CustomerType/CustomerTypeDescription