我正在为报告模型(SQL Server Reporting Services)创建数据源。这些报告需要大量的连接和计算(比如说,计算财务参数,比如花在这个、那个、金额 A 和金额 B 上的钱)......所有这些都涉及子对象。
为这段代码编写单元测试对我来说很有意义(即遍历订单集合,根据业务规则和子对象聚合信息等)。为了正确地做到这一点,我希望我的代码看起来大约。像这样
foreach (IOrder in Orders)
foreach (IOrderLine in IOrder.Orderlines)
...
return ...
然后测试返回值。
但是这段代码不是将在报告视图中使用的 SQL……当然……所以我在想,我可以在数据库中插入一个 .NET 程序集。这里的问题当然是性能……我不想在 C# 中循环所有这些对象……太慢了。
所以,很自然,Linq/Lambda/Expression 树似乎是我的答案。众所周知,当你在做 Linq to SQL 时,会先构建表达式树,然后基于它们生成适当的 SQL。
因此,我可以使用 lambda 表达式在 Linq to Objects 中编写我的代码,在示例集合上对这段代码进行单元测试(将表达式编译为 .net),并在 DB 存储过程中重用与 Linq to SQL 相同的代码,以便在内部SQL Server 它会为我生成正确的 SQL(就像 Linq to SQL 已经做的那样)......
然后我可以从单元测试和用 C# 编写域逻辑代码以及用于报告的高性能存储过程中获益。
可能的?我可以在 SQL Server CLR 存储过程中使用 Linq/Lambda 吗?有人做过或知道如何使它工作吗?我疯了吗?你知道更好的方法吗?
谢谢
PS我想现在我想出了应该如何正确地做到这一点。根据 Udi Dahan 的说法,如果我理解他的话。数据库应该是非规范化的,所有计算的字段都应该在表中的对象上。当子对象(添加了 OrderLine)发生某些事情时,我的 Customer 对象应该接收一个事件并重新计算智能值(缓存它并保持)。
然后报告直截了当,没有逻辑并且工作快速......