变量'x'是类型为'myClass'的错误变量,在作用域''中被引用,但是它没有被定义。

5

这段代码运行正常:

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));

上述代码在执行时出现了以下错误:

变量“x”属于类型“myClass”,被作用域引用,但未定义

请帮忙解决(对我的糟糕英语表示抱歉)。
Sara 编辑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 方法。它是你自己写的还是从某个库中使用的?它似乎对你传递给它的表达式做了一些奇怪的事情。 - jonnystoten
@applechewer:只有 GetSession() 是我编写的方法。其他所有方法都是 NHibernate 的方法。 - sara
1
可能是 https://dev59.com/UFLTa4cB1Zd3GeqPXBNP 的重复问题。 - nemesv
限制条件.Where在类型方面是如何定义的? - Pharap
我的理解是,通过执行.List<MyClass>,您正在评估此时此刻的代码,并且.Where现在是常规LINQ。这不是我所期望的。我希望SQL而不是LINQ来处理它以评估标准。如果您似乎无法以任何可能的方式使用Restrictions.Where<>(),那么它的意义是什么? - user99999991
显示剩余4条评论
2个回答

0
把你的计算转换成一个属性怎么样(这样还有封装 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<MyClass>(x => this.GetSum(x) > myVariable)); private int GetSum(MyClass x) { return (x.Field1 + x.Field2 + x.Field3 + x.Field4); } 我遇到了同样的错误 :-( 但是将求和操作移动是个好主意(也因为我要重复使用它) - sara
我创建了一个方法,因为我需要传递一个参数(MyClass),然后将 x.Field1 + x.Field2 等相加。 - sara
但是 GetSum 不知道 Field1Field2 等是 MyClass 的属性。 - sara
那...真的不行。如果你有一个参数怎么办?不能是属性。所以 Restrictions.Where<MyClass>(x => x.Foo(param))) 不可能吗?为什么?这没有意义。 - user99999991
如果在“GetSum”计算中需要除了“x”之外的参数,那么您是正确的,“GetSum”不能是属性。但是,请查看原始示例,其中指出所有字段都驻留在“MyClass”中。@sara后来表示该类是自动生成的,因此没有留下添加“GetSum”的空间-在这种情况下,“GetSum”可以在静态实用程序类中制定为“MyClass”扩展方法。 - mhoff
显示剩余3条评论

0
如果RestictionsMyClassIEnumerable,那么尝试进行分割、添加和选择操作:
var v = Restrictions
    .Where(x =>(x.Field1 + x.Field2 +  x.Field3 + x.Field4) >= myVariable));

criteria.Add(v);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接