C# 在WebAPI和ViewModel中使用ODATA$expand查询选项

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

非常相似,但没有满足我的需要

我使用的是实体框架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; }
}
我有一个客户控制器,它公开了一个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