【问题标题】: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 提供了一些灵活性,但它是有限的)。
我希望能够做到的事情如下:
- 通过一些 DTO 定义我的数据合同。
- 拥有可让用户查询我的数据合同 Dtos 的 OData 服务。
- 有一些转换层将 DTO 上的查询转换为查询,例如 EF 模型或 NH。
- 执行翻译后的查询。
- 将结果映射回我的数据合同。
是我疯了还是有办法解决这个问题?
【问题讨论】:
标签:
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);