10

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

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

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

public class Employee
{
    public Guid Id {get; set;}
    public string Name {get; set;}
    public int AccessLevel {get; set;}
}

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

public class EmployeeDto
{
    public string Name {get; set;}
    public string SecurityClearence {get; set;}
}

使用 ASP.NET Web API 和(大概??)Microsoft ASP.NET Web API OData 库我们将如何实现我们的客户将针对 DTO 格式编写查询的场景,例如:

?$filter=(SecurityClearence eq 'TopSecret')

...然后我们会将其转换为我们的数据格式。例如:

?filter=(AccessLevel eq 007)

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

db.Employees.Where(translatedExpression);

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

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

4

3 回答 3

2

加文,

我知道我参加这个聚会可能为时已晚,但这是我在这件事上的两分钱。

早在 2013 年,我在一个项目中工作并想出了同样的场景。我有一个实体模型和一个 DTO 模型,可以传入和传出服务层。我进行了研究,但没有找到任何库可以让我:1. 以自动方式从我的实体模型映射到我的 DTO 模型,以及 2. 将 DTO 上的过滤和排序表达式转换为实体模型。

最后,我决定编写自己的“投影”框架。几个月前,我在GitHub 上发布了代码并上传了一个NuGet包,以防有人需要做类似的事情。

现在,如果您决定尝试它,您必须构建和配置 ProjectionsModel(类似于配置 EF 代码优先数据模型的方式)并指定 DTO 模型类如何映射到实体模型类。

using ExpressionFramework.Projections;

namespace TestDTO
{
    public class MyProjectionModel : ProjectionModel
    {
        protected override void OnModelCreating(ProjectionModelBuilder modelBuilder)
        {
            modelBuilder
                .Projection<UserAccountDTO>()
                .ForSource<UserAccountEntity>(configuration => 
                {
                    configuration.Property(dto => dto.RoleCount).ExtractFrom(entity => entity.Roles.Count());
                });
        }
    }
}

然后,您可以创建一个模型并使用它来将 DTO 查询投影和过滤为实体查询:

IQueryable<UserAccountEntity> usersQuery = usersList.AsQueryable();

var myProjectionModel = new MyProjectionModel();
var dtoUsersList = myProjectionModel.Project<UserAccountDTO, UserAccountEntity>(usersQuery).ToList();

即使是严格过滤也不是示例的一部分,您可以创建对象的集合QueryFilter并将QuerySorter它们作为参数发送给Project方法。

如果您想了解有关此库的更多信息,请告诉我。

于 2014-06-14T02:21:30.903 回答
1

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

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

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

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

于 2013-11-28T10:32:08.100 回答
0

我们公司也在寻求这样做。我一直在考虑的一种可能的解决方案是创建一个自定义的 IQueryable LINQ 提供程序。该提供者将能够将干净的模型转换为数据库模型并在适当的字段上进行查询,以及转换数据。

小菜一碟,对吧?嗯..是的..我们还没有开始。

如果有人有其他建议,请告诉我。

演练:创建 IQueryable LINQ 提供程序

LINQ:构建 IQueryable 提供程序 - 第一部分

于 2014-05-27T21:07:21.613 回答