ASP.NET Web API OData - 将DTO查询转换为实体查询

Gav*_*orn 9 c# expression ado.net-entity-data-model asp.net-web-api asp.net-web-api-odata

我们目前正在研究在我们的Web API中使用OData查询语法.我们不打算实现完整的OData实现 - 仅仅利用查询语法.

通常认为将应用程序分成多个层是一种很好的应用程序架构.在现代Web应用程序中,这些层将包括数据层和UI /传输层,它可以在将数据发送给客户时对存储在数据库中的信息进行不同的建模.

例如:您可能有一个如下所示的数据库(实体框架)模型:

public class Employee
{
    public Guid Id {get; set;}
    public string Name {get; set;}
    public int AccessLevel {get; set;}
}
Run Code Online (Sandbox Code Playgroud)

但是您的Web API可能会以不同的有线格式向客户公开这些数据:

public class EmployeeDto
{
    public string Name {get; set;}
    public string SecurityClearence {get; set;}
}
Run Code Online (Sandbox Code Playgroud)

使用ASP.NET Web API和(可能是??)Microsoft ASP.NET Web API OData库我们如何实现一个场景,我们的客户可以根据DTO格式编写查询,例如:

?$filter=(SecurityClearence eq 'TopSecret')
Run Code Online (Sandbox Code Playgroud)

......然后我们会根据我们的数据格式进行翻译.例如:

?filter=(AccessLevel eq 007)
Run Code Online (Sandbox Code Playgroud)

或其他一些格式,允许我动态查询我的数据库,如表达式.例如:

db.Employees.Where(translatedExpression);
Run Code Online (Sandbox Code Playgroud)

我已经想到了几种手动实现这一目标的方法,但我很想知道其他人如何解决这个问题,因为我觉得到目前为止我的实现是非常粗糙的,不太可能经得起审查.

是否有Web API OData库(以及相关的EDM库)的功能可以为我实现部分或全部功能?

ili*_*ian 1

我们一直在使用实体框架、Automapper 和 LinqToQueryable 的组合。

典型的控制器操作如下所示:

[HttpGet]
[LinqToQueryable]
public IEnumerable<SomeViewModel> SomeAction()
{
    return _databaseContext.Entities
                           .Where(e => e.SomeProp = "Example")
                           .Project()
                           .To<SomeViewModel>();
}
Run Code Online (Sandbox Code Playgroud)

我们需要的 nuget 包是LinqToQuerystring、、、linqtoquerystring.entityframeworkLinqToQuerystring.WebApi文档在这里: http: //linqtoquerystring.net/