自动扩展的OData与控制器

问题描述:

相关实体我有这些类:自动扩展的OData与控制器

public class Items 
    { 
    [Key] 
    public Guid Id { get; set; } 
    public string ItemCode { get; set; } 
    public decimal SalesPriceExcl { get; set; } 
    public decimal SalesPriceIncl { get; set; } 

    public virtual ICollection<ItemPrice> SalesPrices { get; set; } 

    public Items() 
    { 
     SalesPrices = new HashSet<App4Sales_ItemPrice>(); 
    } 
} 

public class ItemPrice 
{ 
    [Key, Column(Order = 0), ForeignKey("Items")] 
    public Guid Id { get; set; } 
    public virtual Items Items { get; set; } 

    [Key, Column(Order=1)] 
    public Guid PriceList { get; set; }   
    public decimal PriceExcl { get; set; } 
    public decimal PriceIncl { get; set; } 
    public decimal VatPercentage { get; set; }   

} 

我要查询的项目,并自动获得ITEMPRICE集合。

我创建了一个OData的V3控制器:

// GET: odata/Items 
    //[Queryable] 
    public IQueryable<Items> GetItems(ODataQueryOptions opts) 
    { 
     SelectExpandQueryOption expandOpts = new SelectExpandQueryOption(null, "SalesPrices", opts.Context); 
     Request.SetSelectExpandClause(expandOpts.SelectExpandClause); 
     return expandOpts.ApplyTo(db.Items.AsQueryable(), new ODataQuerySettings()) as IQueryable<Items>; 


    } 

但我得到的错误: “无法序列空进”

是的,有些项目没有ITEMPRICE名单。

我可以通过这个错误,还是我可以做一些不同的事情?

亲切的问候

的Jeroen

我发现底层错误是: 无法转换 类型的对象 'System.Data.Entity.Infrastructure.DbQuery 1[System.Web.Http.OData.Query.Expressions.SelectExpandBinder+SelectAllAndExpand 1 [.Models.Items]]' 键入'.Models.Items'。

我已经解决了它,我碰到这个岗位来了以后:http://www.jauernig-it.de/intercepting-and-post-processing-odata-queries-on-the-server/

这是我现在的控制器:

SelectExpandQueryOption expandOpts = new SelectExpandQueryOption(null, "SalesPrices", opts.Context); 

     Request.SetSelectExpandClause(expandOpts.SelectExpandClause); 

     var result = expandOpts.ApplyTo(db.Items.AsQueryable(), new ODataQuerySettings()); 
     var resultList = new List<Items>(); 

     foreach (var item in result) 
     { 
      if (item is Items) 
      { 
       resultList.Add((Items)item); 
      } 
      else if (item.GetType().Name == "SelectAllAndExpand`1") 
      { 
       var entityProperty = item.GetType().GetProperty("Instance"); 
       resultList.Add((Items)entityProperty.GetValue(item)); 
      } 
     } 


     return resultList.AsQueryable(); 

的Jeroen

GetItems([FromODataUri] ODataQueryOptions queryOptions)

+0

这会在调用时导致错误,请参阅编辑基础错误 –