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