[英]How can I process a generic query through ASP.NET Core Web API using Entity Framework?
[英]ASP.NET Web API programmatic way of applying IQueryable to an Entity Framework query
我們可以使用Web API從URL接受OData查詢,方法很簡單:
[EnableQuery]
public IQueryable<EFType> GetBuiltInTypes()
{
return db.EFTypes;
}
當OData查詢添加到Entity Framework數據庫查詢中時,數據庫中的數據受到限制。
假設我想在返回數據之前對數據進行一些處理:
[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>;
}
但是我不知道類型,在這種情況下,由於我必須使用的是DbType
,因此在編譯時是Product
。
是的,不要調用ToList / ToArray / AsEnumerable / etc。 或任何其他會導致您的IQueryable實例調用數據庫的情況。
例如:
[EnableQuery]
public IQueryable<SomePOCO> GetBuiltInTypes()
{
var dbQuery = from obj in FncCall() select obj;
// at this point the database has not yet been called
IQueryable<SomePOCO> result = DoSomeWork(dbQuery);
return result;
}
private IQueryable<SomePOCO> DoSomeWork(IQueryable<SomePOCO> dbQuery)
{
// still not executed against db
return dbQuery.Where(x => x.something == "something");
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.