Entity framework 带存储过程的Web API OData

Entity framework 带存储过程的Web API OData,entity-framework,asp.net-web-api,odata,Entity Framework,Asp.net Web Api,Odata,我能在没有EF的情况下利用OData的力量吗 我正在使用现有的数据库,并使用存储过程从数据库中检索来创建模型 AFAIK,当使用$filter时,例如使用带EF的OData-过滤器将应用于DB层 它现在的工作方式是,所有结果都从数据库中返回,然后才应用过滤器 因为这样会浪费处理时间和服务器负载,所以我想知道如何对其进行自定义,以便只返回我需要的结果 也许与EF合作会更容易些 数据库相当复杂-大多数模型对象都是使用联接从许多不同的表中构建的。您可以使用Entity Framework导入存储过程,

我能在没有EF的情况下利用OData的力量吗

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

AFAIK,当使用
$filter
时,例如使用带EF的OData-过滤器将应用于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;
}
public IEnumerable Get(ODataQueryOptions选项)
{
var unitOfWork=new ATMS.Repository.unitOfWork(_dbContext);
var users=options.ApplyTo(unitOfWork.Repository().Queryable
.Include(u=>u.USERGROUPS)
.OrderBy(order=>order.USERNAME))
.Cast().ToList();
unitOfWork.Save();//包含Dispose()项
返回用户;
}
查看返回的数据:


在您的情况下,可以使用EF创建的存储过程实体替换
用户
实体。我相信它可以通过EDMX界面将这些对象识别为“复杂对象”,但不能肯定地回忆起来。

感谢您的指导,我将对此进行研究。你能给我指一些关于这个的文档吗?当然,这里有一个教程:谢谢!这个链接非常有用