【问题标题】:Is it possible to map Linq queries from one Data Model to a query over a different data model?是否可以将 Linq 查询从一个数据模型映射到不同数据模型的查询?
【发布时间】:2013-01-14 21:02:02
【问题描述】:

我想为我的应用程序提供一个 OData 接口。我看到的示例使用 EF 将 LINQ 查询映射到 SQL 查询。

恕我直言,这种方法几乎向世界公开了物理数据库模型(我知道 EF/NH 提供了一些灵活性,但它是有限的)。

我希望能够做到的事情如下:

  1. 通过一些 DTO 定义我的数据合同。
  2. 拥有可让用户查询我的数据合同 Dtos 的 OData 服务。
  3. 有一些转换层将 DTO 上的查询转换为查询,例如 EF 模型或 NH。
  4. 执行翻译后的查询。
  5. 将结果映射回我的数据合同。

是我疯了还是有办法解决这个问题?

【问题讨论】:

标签: linq entity-framework odata


【解决方案1】:

我有 2 个模型,“合同”模型和“持久”模型。持久化模型是实体框架映射到的。返回 IQueryable 的 Get 方法返回一个 IQueryable,它类似于以下内容:

return dbContext.PersistedCustomers.Select(x => new Customer(Name = x.OtherName, ...));

至少在使用 DbContext 而不是 ObjectContext 时,基于合同模型的 Where 标准会自动转换为 PersistedModel 的 Where 标准,以针对数据库执行。希望两者之间的差异不会那么复杂,以至于您需要一些奇怪的数据按摩。我敢肯定它的逆转是有限度的。

【讨论】:

    【解决方案2】:

    一种方法是创建一个代表您的模型的 ViewModel,然后使用AutoMapper 在它们之间进行映射。你可以这样使用:

       var address = _Context.Addresses.Where(p => p.AddressID == addressID).Single();
       AddressVM result = Mapper.Map<AddressVM>(address);
    

    【讨论】:

      猜你喜欢
      • 2019-11-22
      • 1970-01-01
      • 1970-01-01
      • 2013-01-19
      • 1970-01-01
      • 2015-11-12
      • 1970-01-01
      • 1970-01-01
      • 2021-12-22
      相关资源
      最近更新 更多