我可以在没有 EF 的情况下利用 OData 的强大功能吗?
我正在使用现有数据库并使用存储过程创建模型以从数据库中检索。
AFAIK,$filter
例如在使用 OData 和 EF 时 - 过滤器将应用于 DB 层。
它现在的工作方式是从数据库中带回所有结果,然后才应用过滤器。
由于以这种方式浪费了处理时间和服务器负载,我想知道如何自定义它,以便只返回我需要的结果。
也许使用 EF 会更容易?
数据库非常复杂——大多数模型对象都是使用连接从许多不同的表中构建的。
我可以在没有 EF 的情况下利用 OData 的强大功能吗?
我正在使用现有数据库并使用存储过程创建模型以从数据库中检索。
AFAIK,$filter
例如在使用 OData 和 EF 时 - 过滤器将应用于 DB 层。
它现在的工作方式是从数据库中带回所有结果,然后才应用过滤器。
由于以这种方式浪费了处理时间和服务器负载,我想知道如何自定义它,以便只返回我需要的结果。
也许使用 EF 会更容易?
数据库非常复杂——大多数模型对象都是使用连接从许多不同的表中构建的。
您可以使用 Entity Framework 导入您的存储过程,然后将基于这些存储过程的实体与 Web API OData ODataController / EntitySetController 一起使用。
这个回复更多的是关于过滤以及它是如何在幕后工作的,这可能对某人有益。
你说:
它现在的工作方式是从数据库中带回所有结果,然后才应用过滤器。
实际上有两种方法可以从 OData(我遇到过)取回数据。一种是让数据库服务器返回所有数据,然后过滤(效率非常低 - 我相信这就是你所暗示的)。二是通过EF传递OData参数,在数据库层面进行过滤。对于分页之类的事情,框架将返回记录总数(进行了两次查询)。
例如,要显示属于特定组的用户列表,过滤后的数据请求将如下所示:
url: "/api/Users?$filter=USERGROUPS/any(usergroup: usergroup/ID eq '" + groupData.ID + "')"
您要确保将 OData 选项应用于您的 EF 数据库上下文,并且可以按如下方式完成:
public IEnumerable<USER> Get(ODataQueryOptions<USER> options)
{
var unitOfWork = new ATMS.Repository.UnitOfWork(_dbContext);
var users = options.ApplyTo(unitOfWork.Repository<USER>().Queryable
.Include(u => u.USERGROUPS)
.OrderBy(order => order.USERNAME))
.Cast<USER>().ToList();
unitOfWork.Save(); // includes Dispose()
return users;
}
查看返回的数据:
在您的情况下,您可以将USER
实体替换为 EF 创建的 sproc 实体。我相信它通过 EDMX 接口将这些识别为“复杂对象”,但无法确定。