2

我可以在没有 EF 的情况下利用 OData 的强大功能吗?

我正在使用现有数据库并使用存储过程创建模型以从数据库中检索。

AFAIK,$filter例如在使用 OData 和 EF 时 - 过滤器将应用于 DB 层。

它现在的工作方式是从数据库中带回所有结果,然后才应用过滤器。

由于以这种方式浪费了处理时间和服务器负载,我想知道如何自定义它,以便只返回我需要的结果。

也许使用 EF 会更容易?

数据库非常复杂——大多数模型对象都是使用连接从许多不同的表中构建的。

4

2 回答 2

3

您可以使用 Entity Framework 导入您的存储过程,然后将基于这些存储过程的实体与 Web API OData ODataController / EntitySetController 一起使用。

于 2013-10-29T17:29:03.067 回答
3

这个回复更多的是关于过滤以及它是如何在幕后工作的,这可能对某人有益。

你说:

它现在的工作方式是从数据库中带回所有结果,然后才应用过滤器。

实际上有两种方法可以从 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 接口将这些识别为“复杂对象”,但无法确定。

于 2014-01-10T14:22:35.153 回答