EF4 complex Select():从Business Tier返回IEnumerable或IEnumerable <mycustomdto>?</mycustomdto>

时间:2012-11-04 02:55:40

标签: c# entity-framework-4 anonymous-types business-logic-layer ef-database-first

我已经开始了一项新工作,我们正在将一个相当大的VB.NET 2.0应用程序(带有数据集)迁移到C#4.5(使用EF4。)

从我们的业务层,我们的“搜索”功能现在返回我们的EDMX中定义的类的IEnumebles。所以这样的事情很简单:

public IEnumerable<Product> GetProductsByCategory(int categoryId)

但是当我们的EF4“Select()”方法产生更复杂的自定义(匿名)类型时,它会更复杂:没有与结果对应的生成类。

因为这个函数必须越过层边界(Business到UI),我认为适当的解决方案是为这个查询定义一个自定义类型,然后返回该类型的IEnumerable; e.g。

public IEnumerable<ProductAccountSummary> GetProductAccountSummariesByCategory(int categoryId)

其中ProductAccountSummary是手工制作的DTO(即POCO)。

然而,在代码审查期间,团队负责人未能通过我的方法;他要我删除DTO并将方法签名更改为:

public IEnumerable GetProductAccountSummariesByCategory(int categoryId)

....原因是我们仍然可以将IEnumerable绑定到我们的UI网格等,而不需要每次我们需要使用自定义类型时手工制作DTO的开销。

所以我的问题是:

  • 在EF4中,跨层边界传递自定义类型集合的典型方法是什么?返回IEnumerable(隐含地,“对象”)对我来说似乎不对。我错过了什么吗?

1 个答案:

答案 0 :(得分:4)

我认为你的团队领导是完全错误的。处理强类型对象通常被视为处理事物的方式。使用这种方法,您又回到了再次使用数据集等类型的世界。当开始需要修改对象并将其传递回业务层时,将会出现长期维护问题。即使没有任何东西需要返回到业务层,客户端也会出现维护问题。

是的,创建DTO会产生开销,但短期速度不应成为最终长期维护问题的原因。