Я создаю источник данных для модели отчетов (службы отчетов SQL Server).
Отчеты требуют много объединений и вычислений (скажем, вычисление финансовых параметров, таких как деньги, потраченные на это, то есть сумма A против суммы B) ... все это включает подобъекты.
Для меня имеет смысл написать модульные тесты для этого кода (т. Е. Проходить сбор заказов, собирать информацию на основе бизнес-правил, подобъектов и т. Д.)
Чтобы сделать это правильно, я ожидаю, что мой код будет выглядеть ок. как это
foreach (IOrder in Orders)
foreach (IOrderLine in IOrder.Orderlines)
...
return ...
и затем проверьте возвращаемое значение.
Но этот код не является SQL, который будет использоваться в представлении отчетов ... конечно ...
Так что я думаю, я мог бы подключить сборку .NET в базе данных.
Проблема здесь, конечно, в производительности ... Я не хочу зацикливать все эти объекты в C # ... слишком медленно.
Так что, естественно, деревья Linq / Lambda / Expression кажутся мне ответом.
Как мы знаем, когда вы выполняете Linq to SQL, создаются деревья выражений, а затем на их основе генерируется правильный SQL.
Итак, я мог бы написать свой код в Linq to Objects, используя лямбда-выражения, выполнить модульное тестирование этого кода на образцах коллекций (с выражениями, скомпилированными в .net) и повторно использовать тот же код, что и Linq to SQL, в хранимой процедуре DB, так что внутри SQL Server он будет генерировать правильный SQL для меня (как уже делает Linq to SQL) ...
Тогда я мог бы воспользоваться преимуществами как модульных тестов, так и написания логики кода домена в C # и высокопроизводительных хранимых процедур для отчетов.
возможно? Могу ли я использовать Linq / Lambda в хранимых процедурах CLR SQL Server? Кто-нибудь делал или знает, как заставить это работать?
Я сумасшедший? Вы знаете лучший способ сделать это?
Спасибо
P.S. Я думаю, теперь я понял, как это должно быть сделано правильно . По словам Уди Дахана, если я правильно его понимаю. База данных должна быть денормализована, а все рассчитанные поля должны быть на объектах в таблице.
Когда что-то происходит с подобъектом (добавлен OrderLine), мой объект Customer должен получить событие и пересчитать интеллектуальное значение (кэшировать его и сохранить).
Тогда отчеты идут прямо, без логики и работают быстро ...