当我对下面示例代码中定义的控制器方法运行以下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();
}
答案 0 :(得分:0)
当你使用$ expand或$ select,然后使用ApplyTo方法时,结果不再是IQueryable,这就是你返回null的原因。在这种情况下,除了继续使用AutoMapper之外,我认为没有理由要使用ApplyTo方法。放弃自动映射,投射到DTO,并使用[可查询]装饰方法最好。