将问题与Linq To SQL和DTO分开

时间:2008-09-09 03:40:22

标签: c# linq dto-mapping

我最近开始了一个新的webforms项目,并决定将业务类与任何DBML引用分开。我的业务层类代替访问离散的数据层方法,并且是DTO的返回集合。因此,数据层可能会像以下一样投影DTO:

(from c in dataContext.Customers
where c.Active == true 
select new DTO.Customer
{
   CustomerID = c.CustomerID,
   Name = c.CustomerName,
   ...
}).ToList()

尽管构建DTO对象增加了工作量,但这对于Business& S之间的紧密绑定感觉更好。数据层和方法我可以在没有数据库存在的情况下测试业务层。

我的问题是,这是一个好的做法吗?有没有办法生成DTO(可能是通过SQLMetal),以及随着项目的进展可能会遇到的其他问题。

2 个答案:

答案 0 :(得分:5)

我不知道这是不是最好的做法,但我在最近的一段时间里写过类似的代码,因为我觉得我可以通过使用自己的类而不是LINQ设计器生成的类来改善关注点的分离在我的申请中。

您可能需要考虑返回IQueryable< Customer>而不是IList< Customer>来自您的数据访问方法。由于IQueryable< T>继承自IEnumerable< T>你的应用程序的其余部分应该能够很好地处理它。您还可以在需要时将其转换为List。

这样做的好处是,您可以非常轻松地动态修改查询,并最大限度地减少从SQL Server返回的数据量。

E.g。如果您的方法签名是 IQueryable的<客户和GT; GetCustomers()您可以通过调用GetCustomers()获得单个客户。其中(c => c.CustomerID == 101).Single();

在这个例子中,只有一条记录会从数据库中返回,而我想现在你的代码会返回所有客户,或者你需要编写单独的方法(因而是非常重复的代码)来满足所有不同的东西你可能想过滤。

答案 1 :(得分:2)

在我看来,在大多数情况下,处理LINQ时不需要DTO对象。生成的LINQ类可以轻松测试。 LINQ使您能够使用相同的查询从不同的源查询数据。它使您能够针对对象列表而不是真正的数据库测试您的查询。