【发布时间】:2018-05-01 16:18:08
【问题描述】:
我们可以通过 Web API 接受来自 URL 的 OData 查询,这很简单:
[EnableQuery]
public IQueryable<EFType> GetBuiltInTypes()
{
return db.EFTypes;
}
在将 OData 查询添加到实体框架数据库查询时,数据在数据库中受到限制。
假设我想在返回数据之前对其进行一些处理:
[EnableQuery]
public IQueryable<SomePOCO> GetBuiltInTypes()
{
var dbQuery = from obj in FncCall() select obj;
//Do something with the data and put the result into a
//List<SomePOCO>
var list = DoSomeWork(dbQuery) //whatever
return list.AsQueryable();
}
注意:FncCall() 返回通用 DbSet 而不是 DbSet<SomeType>
它仍然可以工作,但它会限制结果并将 OData 查询应用到内存中我的list,而不是将dbQuery 应用到数据库?有什么简单的方法吗?
来自 Microsoft 文档:
我们可以的
public IQueryable<Product> Get(ODataQueryOptions opts) {
var settings = new ODataValidationSettings() {
// Initialize settings as needed.
AllowedFunctions = AllowedFunctions.AllMathFunctions
};
opts.Validate(settings);
IQueryable results = opts.ApplyTo(products.AsQueryable());
return results as IQueryable<Product>;
}
但我不知道类型,在这种情况下,编译时 Product 因为我必须使用的是 DbType。
【问题讨论】:
-
好吧,没有任何关于
DoSomeWork()做什么的上下文,只要它是可以转换为 SQL 并返回为IQueryable的东西就可以了吗? -
是的,但这不是一项可以添加到查询中并在数据库中完成的工作,它将对象转换为另一组对象类型。
-
我还是不明白为什么你必须使用通用版本? OData 库上的哪些方法仅限于 IQueryable
的通用版本? -
可能我真的看不太对...我再复习一下...稍后我会更新或回复
标签: c# asp.net entity-framework asp.net-web-api odata