【问题标题】:Error variable 'x' of type 'myClass' referenced from scope '', but it is not defined从范围“”引用的“myClass”类型的错误变量“x”,但未定义
【发布时间】:2012-08-16 12:46:32
【问题描述】:

这段代码运行良好:

ICriteria criteria = GetSession().CreateCriteria<MyClass>();
criteria.Add(Restrictions.Where<MyClass>(x => x.Field1 >= myVariable));

但是下面的代码不起作用:

criteria.Add(Restrictions        
        .Where<MyClass>(x =>          
        (x.Field1 +
        x.Field2 +
        x.Field3 +
        x.Field4) >= myVariable));

上面的代码在执行时出现这个错误:

从范围“”引用的“myClass”类型的变量“x”,但它不是 定义

请帮忙(抱歉我的英语不好)。

萨拉

编辑 1

我的临时解决方案是:

var result = criteria.List<MyClass>();    
result.Where(x => (x.Field1 + x.Field2 + x.Field3 + x.Field4 >= myVariable));

和这项工作。我宁愿将 Where 子句放在选择之前...

编辑 2

最终的解决方案是(正如@mhoff 所建议的那样):

var result = criteria.List<MyClass>();    
result.Where(x => this.GetSum(x) >= myVariable);

... do something ...

... ToList()


private int GetSum(MyClass x) {
 return (x.Field1 + x.Field2 + x.Field3 + x.Field4);
}

【问题讨论】:

  • 看起来这不是 Linq 中的 Where 方法。它是您编写的还是来自您正在使用的库?看起来它对你传递的表达式做了一些时髦的事情。
  • @applechewer:只有 GetSession() 是我写的方法。其他的都是 NHibernate 方法。
  • 这和多行无关? stackoverflow.com/questions/5653703/… 不应该,只是猜测。您可以尝试将 {} 添加到 lambda 以确保。
  • @AndreasReiff:即使在队列中,我也会遇到同样的错误

标签: c# fluent-nhibernate restrictions


【解决方案1】:

把你的计算变成一个属性怎么样(这也有封装 MyClass 细节的好处):

public class MyClass
{
    public int GetSum
    {
        get { return Field1 + Field2 + Field3 + Field4; }
    }
}

criteria.Add(Restrictions.Where<MyClass>(x => x.GetSum > myVariable));

【讨论】:

  • criteria.Add(Restrictions.Where&lt;MyClass&gt;(x =&gt; this.GetSum(x) &gt; myVariable)); private int GetSum(MyClass x) { return (x.Field1 + x.Field2 + x.Field3 + x.Field4); } 我有同样的错误 :-( 但是移动总和是个好主意(也因为我重复使用它)
  • 我创建了一个方法,因为我必须传递一个参数(MyClass),然后输入x.Field1+ x.Field2 + 等
  • 为什么不简单地x =&gt; x.GetSum - 无需将“x”传递给“this.GetSum”
  • GetSum 不知道 Field1Field2 等属于 MyClass 的属性
  • GetSum 位于MyClass 类中,对吗? Field1/2..MyClass 上的所有属性吗?请在我们的环境中尝试一下。
【解决方案2】:

如果 RestictionsIEnumerableMyClass 则尝试除法添加和选择:

var v = Restrictions
    .Where(x =>(x.Field1 + x.Field2 +  x.Field3 + x.Field4) >= myVariable));

criteria.Add(v);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-10
    • 2015-10-08
    相关资源
    最近更新 更多