OdataQueryOptions生成空表达式

时间:2013-11-22 14:47:48

标签: asp.net-web-api odata asp.net-web-api2

当我对下面示例代码中定义的控制器方法运行以下OData查询时,Get()中的结果查询变为null: http://my.host/api/MyClass/?$ filter = Id eq 1& $ expand = MySecondClass

ODataQueryOptions not being applied中的答案表明这是实现目标的方法,但它仍然失败。是的,MyClass确实引用了MySecondClass。 :)

编辑:经过一番研究后,只有当我使用$ expand时,查询才会显示为空。使用$ filter,everthing按预期工作。是否有一些使用$ expand的陷阱,我不知道?

public MyClass {
    public int Id { get; set; }
    public int MySecondClassId { get; set; }
    public MySecondClass MySecondClass { get; set; }
}

public MySecondClass {
    public int Id { get; set; }
}

public MyDbContext : DbContext {
    public DbSet<MyClass> MyClasses { get; set; }
}

public IQueryable<MyClassDto> Get(ODataQueryOptions<MyClass> options)
{
    var dbContext = new MyDbContext();
    IQueryable<MyClass> myClasses = dbContext.MyClasses;
    var query = options.ApplyTo(myClasses) as IQueryable<MyClass>; // query is null!
    query.ToList().Select(Mapper.Map<MyClass, MyClassDto>).AsQueryable();
}

1 个答案:

答案 0 :(得分:0)

当你使用$ expand或$ select,然后使用ApplyTo方法时,结果不再是IQueryable,这就是你返回null的原因。在这种情况下,除了继续使用AutoMapper之外,我认为没有理由要使用ApplyTo方法。放弃自动映射,投射到DTO,并使用[可查询]装饰方法最好。