在Breeze中使用DTO时进行高效查询

时间:2014-02-27 14:14:13

标签: entity-framework breeze dto

我们正在使用DTO服务器端,并使用流畅的api配置了dbcontext,以便为其提供所需的元数据。我们将1:1映射到我们的真实数据库实体,每个DTO包含真实数据库实体属性的简单子集。

这很好用,但是现在我需要找到一种方法来提高查询效率 - 例如,如果Breeze客户端查询单个项目,我不想在我可以过滤之前创建一整套DTO对象。即我想找出一种方法来对实际实体执行过滤/排序,但仍然返回DTO对象。

我想我需要找到一种拦截查询执行的方法,以便查询我的真实数据库实体并返回DTO而不是真正的数据库实体。

关于如何最好地解决这个问题的任何想法?

1 个答案:

答案 0 :(得分:0)

事实证明,如果在链接语句中使用投影,例如

From PossibleCustomer As Customer
In Customers
Select New CustomerDto With {.Id = PossibleCustomer.Id,
                             .Name = PossibleCustomer.Name,
                             .Email = PossibleCustomer.Email}

..然后linq足够聪明,仍然可以优化对数据库的任何查询 - 也就是说,如果我在上面的linq语句中查询以通过Id过滤单个项目,那么数据库只针对单个项目使用该查询进行查询创建单个DTO。非常聪明的东西。这只适用于你在linq语句中进行直接投影的情况 - 如果你调用一个函数来创建你的DTO,那么这将不起作用。

为了防止其他人面临同样的情况,您可能希望查看AutoMapper - 它可以使用您只创建一次的模型为您创建这些投影 - 避免所有那些难以阅读和验证的巨大linq语句。自动播放器投影(假设您坚持使用简单的东西)仍然允许linq实体魔术,确保您在创建DTO时不必进行表扫描。