从作用域引用的'Product'类型的变量'x',但未定义

时间:2011-01-12 19:45:15

标签: c# lambda subsonic3 linq-expressions

我在类库项目中有一个名为Product的类。我正在使用SubSonic SimpleRepository来持久化对象。我在Product class:

中有如下方法
public static IList<Product> Load(Expression<Func<Product, bool>> expression)
{
    var rep=RepoHelper.GetRepo("ConStr");
    var products = rep.Find(expression);
    return products.ToList();
}

我正在调用这个函数:

private void BindData()
{
    var list = Product.Load(x => x.Active);//Active is of type bool
    rptrItems.DataSource = list;
    rptrItems.DataBind();
}

Load调用BindData会引发异常:

variable 'x' of type 'Product' referenced from scope '', but it is not defined

我该如何解决这个问题。

编辑: - 通过单步执行SubSonic代码,我发现此函数抛出了错误

private static Expression Evaluate(Expression e)
{
    if(e.NodeType == ExpressionType.Constant)
        return e;
    Type type = e.Type;
    if(type.IsValueType)
        e = Expression.Convert(e, typeof(object));
    Expression<Func<object>> lambda = Expression.Lambda<Func<object>>(e);
    Func<object> fn = lambda.Compile(); //THIS THROWS EXCEPTION
    return Expression.Constant(fn(), type);
}

1 个答案:

答案 0 :(得分:13)

将我的头撞在墙上多日,甚至向Jon Skeet寻求帮助之后,我发现了问题所在。

问题实际上是SubSonic(@Timwi是对的)。这是正确的:

var list = Product.Load(x => x.Active);//Active is of type bool

我将其更改为:

var list = Product.Load(x => x.Active==true);
一切都很顺利。