Поскольку мы перенесли наши решения с VS2010 на VS2017, лямбда-выражение NHibernate QueryOver работает неправильно. После различных тестов я обнаружил, что при удалении JoinAlias (но при явном удалении из кода, независимо от того, выполняется он или нет), код работает нормально.
После отладки NHibernate (3.3.3SP1) я обнаружил, что разница была в псевдониме соединения (выражении), который в плохом случае определяется как MemberAccess, а соответствующая строка странная.
Я попытаюсь показать соответствующие части моего кода, но само по себе тестирование работает нормально:
LiquidacionDao.cs
Poliza aliasJoinCia = null;
this.Session.QueryOver<Recibo>(() => recibo)
.Inner.JoinQueryOver<Poliza>(r => r.Poliza, () => aliasJoinCia);
...
...
...
// If I remove those lines, the code works
GestorDeCobro aliasJoinGestoresCobro = null;
queryOver.Inner.JoinAlias(r => r.GestorDeCobro, () => aliasJoinGestoresCobro);
...
...
return queryOver.List();
Отлаживая JoinQueryOver и JoinAlias, я видел, что когда они работают (без последних строк), отладчик показывает на часах следующую строку:
{() => value(mpm.seg.Dao.Recibos.Liquidaciones.LiquidacionDao+<>c__DisplayClass33_0).aliasJoinCia}
и свойство "DebugView":
.Constant<mpm.seg.Dao.Recibos.Liquidaciones.LiquidacionDao+<>c__DisplayClass6_0>(mpm.seg.Dao.Recibos.Liquidaciones.LiquidacionDao+<>c__DisplayClass6_0).aliasJoinCia
И когда это не удается, часы показывают следующую строку:
{() => value(mpm.seg.Dao.Recibos.Liquidaciones.LiquidacionDao+<>c__DisplayClass33_3).CS$<>8__locals1.aliasJoinCia}
и свойство "DebugView":
.Lambda #Lambda1<System.Func`1[mpm.seg.ServiceModel.DataContracts.Polizas.Poliza]>() {
(.Constant<mpm.seg.Dao.Recibos.Liquidaciones.LiquidacionDao+<>c__DisplayClass34_3>(mpm.seg.Dao.Recibos.Liquidaciones.LiquidacionDao+<>c__DisplayClass34_3).CS$<>8__locals1).aliasJoinCia
}
Я не могу понять, почему в некоторых случаях выражение интерпретируется по-разному, и только в Visual Studio 2017, если я открываю код в Visual Studio 2010, всегда работает нормально.





Пришло время обновить.
Введение компилятора Roslyn в Visual Studio 2015 внесло небольшое изменение в способ создания замыканий в деревьях выражений. К сожалению, это изменение не было предусмотрено в NHibernate (предсказать такие изменения очень сложно).
Это было исправлено в 3.3.5/3.4.1/4.0.4 (проблема: NH-3795).
В версии 3.3.5 исправлено только 2 ошибки поверх используемой вами версии, поэтому обновление должно быть абсолютно безопасным.
Я нашел 3.3.5 здесь: nuget.org/packages/NHibernate/3.3.5.4000, и он отлично работает. Большое спасибо!
Большое спасибо, я постараюсь сначала быстро перейти на 3.3.5, а в среднесрочной перспективе я бы обновился до более продвинутой версии. Я проверю как ответ, когда проверю этот момент.