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");
}