问题描述
我们将 Vs2019 与旧版本的 Nhibernate 3.2 一起使用。
我们最近升级到了 VS2019。此代码在 VS2010 中正常工作。
我们在 Nibernate QueryOver 中遇到此错误,where 子句中的 lambda 表达式。我将其精简为最小版本。在运行时块 1 失败,块 2 没有。为什么?我想不通。
它可能与 .net framework 4.8、roselyn 或旧版本的 Nhibernate 相关吗?
我没有在此处发布所有业务对象,但如果需要,我可以这样做。我也在不同业务对象的应用程序中看到了这种行为。
无法解析属性:CS$8__locals2 of:BusinessObjectMain
区块 1
var EventQuery = session.QueryOver<BusinessObjectMain()
.JoinAlias(ce => ce.Bo1,() => Bo1)
.JoinAlias(ce => ce.Bo2,() => Bo2,JoinType.LeftOuterJoin)
.JoinAlias(() => Bo2.Bo3,() =>Bo3,JoinType.LeftOuterJoin)
;
for (int i = 0; i < 1; i++) {
object[] arr = new object[1];
arr[0] = 202;
EventQuery = EventQuery.Where(() => Bo3.TypeId.IsIn(arr));
}
var Results = EventQuery.Future<Data>();
var list = Results.ToList();---Error happens here. Could not resolve property: CS$<>8__locals2 of: BusinessObjectMain
为什么下面的代码有效?如果我将 Where 子句移到 for 循环之外,它可以正常工作而不会出现任何错误
区块 2
var EventQuery = session.QueryOver<BusinessObjectMain()
.JoinAlias(ce => ce.Bo1,() => Bo1)
.JoinAlias(ce => ce.Bo2,JoinType.LeftOuterJoin)
.JoinAlias(() => Bo2.Bo3,JoinType.LeftOuterJoin)
;
object[] arr = new object[1];
arr[0] = 202;
EventQuery = EventQuery.Where(() => Bo3.TypeId.IsIn(arr));
for (int i = 0; i < 1; i++) {
}
var Results = EventQuery.Future<Data>();
var list = Results.ToList()
解决方法
这是 NHibernate 中的一个错误,与自 Visual Studio 2015 以来使用的 Roslyn 编译器相关(因为 Roslyn 编译 lambda 的方式不同)。见https://nhibernate.jira.com/browse/NH-3795、https://github.com/nhibernate/nhibernate-core/pull/441
已在 NHibernate 3.3.5、3.4.1 和 4.0.4+ 版本中修复