1

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

未应用 ODataQueryOptions 中的答案表明这是这样做的方法,但它仍然失败。是的,MyClass 确实引用了 MySecondClass。:)

编辑:经过更多研究,似乎只有当我使用 $expand 时查询才为空。使用 $filter,一切都按预期工作。使用 $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();
}
4

1 回答 1

0

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

于 2014-03-11T23:53:49.250 回答