无法解析属性:CS$<>8__locals2 of:BusinessObjectMain; Nhibernate QueryOver Linq,for 循环内的 lambda 表达式

问题描述

我们将 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-3795https://github.com/nhibernate/nhibernate-core/pull/441

已在 NHibernate 3.3.5、3.4.1 和 4.0.4+ 版本中修复