我们可以创建一个记录数组,并允许它成为Queryable:
var entities = new[] {
new Product{ Id = 1,Category = "Test 1" },
new Product{ Id = 2, Category = "Test 2" },
new Product{ Id = 3, Category = "Another texts" },
}.AsQueryable();
如果不是在内存中查询,我们如何获得相同的功能,我们直接进入数据库?
具体用例是通过odata公开数据:
public IQueryable<Product> Get()
{
// plug your entities source (database or whatever)
var entities = (mydatabaseentity????).AsQueryable();
var modelManager = (IODataModelManger)HttpContext.RequestServices.GetService(typeof(IODataModelManger));
var model = modelManager.GetModel(nameof(Web1));
var queryContext = new ODataQueryContext(model, typeof(Product), null);
var queryOptions = new ODataQueryOptions(queryContext, HttpContext.Request);
return queryOptions
.ApplyTo(entities, new ODataQuerySettings
{
HandleNullPropagation = HandleNullPropagationOption.True
})
.Cast<Product>();
}
我们如何从数据库中公开数据,以使其可以像上面的产品实体那样进行查询,然后允许它可以进行odata查询?
答案 0 :(得分:1)
您最好的选择是使用像实体框架这样的ORM。
假设您定义了一个映射到数据库的Context。
public class ProductContext : DbContext
{
public DbSet<Product> Products {get; set;}
}
然后像var products = _context.Products;
这样的简单查询实际上会为您返回IQueryable
。为您的项目设置实体框架的细节将取决于您的数据库以及Product类的外观,但关键是DbSet
本身是IQueryable
。同样,您可以通过执行_context.Products.Where(p => p.Name == "SOMEVALUE");
之类的操作为查询添加约束。使用Entity Framework,您无需添加.AsQueryable()
。返回的值已经是IQueryable
。
以下文档应该有所帮助:
https://docs.microsoft.com/en-us/ef/core/
https://docs.microsoft.com/en-us/ef/core/get-started/aspnetcore/existing-db