簡體   English   中英

將IQueryable應用於實體框架查詢的ASP.NET Web API編程方式

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM