【问题标题】:Lambda runtime exception 'variable ' ' of type ' ' referenced from scope '', but is not definedLambda 运行时异常“变量”类型“变量”从范围“”引用,但未定义
【发布时间】:2013-07-27 02:36:23
【问题描述】:
DataMore1 dm1 = null;
DataMore2 dm2 = null;    

var list = session.QueryOver<Data>()
    .JoinAlias(data => data.DataMore1, () => dm1, NHibernate.SqlCommand.JoinType.LeftOuterJoin, Expression.Eq("Segment", 0))
    .JoinAlias(data => data.DataMore2, () => dm2, NHibernate.SqlCommand.JoinType.LeftOuterJoin, Expression.Eq("Segment", 0))
    .Select(d => 
        new Data ()
        {
            PlantID = d.PlantID,
            AreaID = d.AreaID,
            CellID = d.CellID,
            DeviceID = d.DeviceID,
            StartDateTime = d.StartDateTime,
            DataPoint01 = d.DataPoint01,
            DataMore1 = new List<DataMore1>(new List<DataMore1>
            {
                new DataMore1 { Segment = dm1.Segment, DataPoint101 = dm1.DataPoint101 }
            }),
            DataMore2 = new List<DataMore2>(new List<DataMore2>
            {
                new DataMore2 { Segment = dm2.Segment, DataPoint201 = dm2.DataPoint201 }
            })
        })
    .List<Data>();

产生此异常。

variable 'd' of type 'FNHSamples.Data' referenced from scope '', but it is not defined

【问题讨论】:

  • 你确定这是 runtime 错误吗??
  • 这当然不是编译时错误,因为它编译得很好并且在运行时中断。

标签: c# lambda


【解决方案1】:

在定义 d 之后,您缺少一个左大括号。 我也添加了退货。

尝试以下方法:

DataMore1 dm1 = null;
DataMore2 dm2 = null;    

var list = session.QueryOver<Data>()
    .JoinAlias(data => data.DataMore1, () => dm1, NHibernate.SqlCommand.JoinType.LeftOuterJoin, Expression.Eq("Segment", 0))
    .JoinAlias(data => data.DataMore2, () => dm2, NHibernate.SqlCommand.JoinType.LeftOuterJoin, Expression.Eq("Segment", 0))
    .ToList()
    .Select(d => 
        {
            return new Data ()
            {
                PlantID = d.PlantID,
                AreaID = d.AreaID,
                CellID = d.CellID,
                DeviceID = d.DeviceID,
                StartDateTime = d.StartDateTime,
                DataPoint01 = d.DataPoint01,
                DataMore1 = new List<DataMore1>(new List<DataMore1>{new DataMore1 { Segment = dm1.Segment, DataPoint101 = dm1.DataPoint101 }}),
                DataMore2 = new List<DataMore2>(new List<DataMore2>{new DataMore2 { Segment = dm2.Segment, DataPoint201 = dm2.DataPoint201 }})
            };
        })
        .List<Data>();

【讨论】:

  • 感谢您的尝试。然而,这会产生编译时错误。 “无法将带有语句体的 lambda 表达式转换为表达式树”……正在研究这个错误……
  • 查看我的编辑,我在Select 之前添加了一个ToList() 以强制查询在转换之前执行。
  • 太棒了!现在我知道为什么 dm1 和 dm2 为空 :) 谢谢你让我克服了第一个障碍。
  • 这绝不是一个可以接受的答案。 dm1 和 dm2 显然是空的,因为它们在查询本身之后被解析。投反对票
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-10
  • 2015-10-08
  • 1970-01-01
相关资源
最近更新 更多