Ха, я сам нашел решение:)
Инстинкт Робертса о функции LINQ заставил меня погуглить.Результаты не имели отношения к данному вопросу, но небольшой код, на который я наткнулся, заставил меня задуматься о методе атаки методом перебора.Используя идею redoced о частичном классе, я наконец написал этот фрагмент кода в отдельном файле .cs:
public partial class WindowExcel
{
private static decimal GetOwnCost(CustomerFrameVariationCategory cfvc, bool frameModuleAnyNonActive, DateTime selectedDateTime)
{
return cfvc.FrameVariationCategory.FrameVariation.FrameVariationModules.Sum(fvm => // sum all frame variation modules
(frameModuleAnyNonActive ? 0 : fvm.FrameModule.FrameModuleValueChanges.Where(fmvc => fmvc.ChangeDateTime <= selectedDateTime) // if module not active then 0
.OrderByDescending(fmvc2 => fmvc2.ChangeDateTime).FirstOrDefault().Porolone) + // otherwise get Porolone
fvm.FrameModule.FrameModuleComponents.Sum(fmc => // add to Porolone sum of all module components
(fmc.Article.ArticleDetails.Any() ? fmc.Article.ArticleDetails.Sum(ad => // if any article details then use A*L*W*T instead of Amount
WindowExcel.MultiplyArticleDetailValues(ad.ArticleDetailValueChanges.Where(advc => advc.ChangeDateTime <= selectedDateTime)
.OrderByDescending(advc2 => advc2.ChangeDateTime).FirstOrDefault() ?? new ArticleDetailValueChange())) :
WindowExcel.GetModuleComponentAmount(fmc.FrameModuleComponentValueChanges.Where(fmcvc => fmcvc.ChangeDateTime <= selectedDateTime) // no details = get amount
.OrderByDescending(fmcvc2 => fmcvc2.ChangeDateTime).FirstOrDefault() ?? new FrameModuleComponentValueChange())) * // times article values
WindowExcel.MultiplyArticleValues(fmc.Article.ArticleValueChanges.Where(avc => avc.ChangeDateTime <= selectedDateTime)
.OrderByDescending(avc2 => avc2.ChangeDateTime).FirstOrDefault() ?? new ArticleValueChange())));
}
}
И в своем гигантском запросе LINQ я переписал OwnCost следующим образом:
OwnCost = WindowExcel.GetOwnCost(cfvc, lastValue4, this.SelectedDateTime)
Редактирование метода GetOwnCost все еще мучительно медленно, как это было исключено, но по крайней мере остальная часть моего проекта теперь пригодна для использования.Я не уверен, что эта грубая сила делает производительность.Тот факт, что я не могу перефразировать CustomerFrameVariationCategory и что дерево выражений OwnCost находится внутри метода, а не в самом запросе LINQ, вызывает вопросы.Думаю, мне придется профилировать это в какой-то момент, но это еще одна проблема.
Теперь к деликатному вопросу о том, что пометить в качестве ответа.Хотя я ценю все комментарии, пока ни один из ответов не был верным (никакого конкретного решения), поэтому я должен отметить свой пост как ответ.Но я буду голосовать за повторные ответы и ответы Роберта за то, что они указали мне правильное направление.
Буду признателен, если кто-нибудь сможет прокомментировать возможные влияния производительности выполнения кода для моего решения по сравнению с исходным кодом.
PS!Запись этого в Internet Explorer 8 снова мучительно медленная из-за постоянной загрузки процессора (как-то связана с окраской кода).Так что это не только проблема VS ...
Редактировать:
Кажется, Роберту удалось опубликовать точно такое же решение, которое я придумал.Возможно, мой ответ был бы опубликован ранее, если бы не постоянная загрузка процессора ...
По справедливости я отметил пост Роберта как ответ:)