2011-01-12 10 views
11

クラスライブラリプロジェクトにProductという名前のクラスがあります。私はオブジェクトを永続化するためにSubSonic SimpleRepositoryを使用しています。私はProductクラスに以下のような方法を持っている:私はこのように、この関数を呼んでいるスコープから参照される 'Product'タイプの変数 'x'は定義されていません

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

BindDataからLoadを呼び出す

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

は例外をスロー:

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

どのようにすることができます私はこれを解決する。

編集: - 私はエラーが多くの日のために壁に頭を強打しても、助けを求めジョンスキートを求めた後、この機能

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

SubSonicのバグのようです。 (@コビー:いいえ) – Timwi

+0

@ティムウィこれを回避するには? – TheVillageIdiot

答えて

13

によってスローされることがわかっSubSonicコードを踏んで、私が見つけました問題。

問題は実際にはSubSonic(@Timwiが正しい)にあります。これは、右の行にあります。

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

私はそれを変更した後:

var list = Product.Load(x => x.Active==true); 

すべてが順調でした。

+5

これがなぜ問題だったのか知っていますか? – mat

+2

これは、エラーメッセージのトップヒットですが、残念ながら、これは私と@ user1039462を含むほとんどの問題の答えではありません。私にとっては、どこでも同じParameterExpression *を使用する必要があるという問題でした。 ParameterExpressionが同じ変数名を持つことは、**十分ではありません。私はそれが信じていたが、私は式ツリーとルートのLambdaExpressionのParameterExpressionと同じインスタンスではなかったので、スコープについての例外を得るだろう。 – Will

+0

@問題はSubSonicにありました。明示的に設定されていなければ、変数値を設定していませんでした。 – TheVillageIdiot

関連する問題