ASP.NET Web API программный способ применения IQueryable к запросу Entity Framework

Мы можем принять запрос OData от URL с помощью веб-API, и это так же просто, как:

[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>;
}

но я не знаю тип, в этом случае, Product во время компиляции, как то, что я должен работать с DbType,

1 ответ

Да, не вызывайте ToList/ToArray/AsEnumerable/ и т.д. или что-нибудь еще, что заставит ваш экземпляр 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");
}
Другие вопросы по тегам