Поскольку мы перенесли наши решения с 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, работает всегда хорошо.