2011-01-12 11 views
11

Ich habe eine Klasse mit dem Namen Product in Klassenbibliothek Projekt. Ich verwende SubSonic SimpleRepository, um Objekte zu persistieren. Ich habe eine Methode wie in Product Klasse folgt:Variable 'x' vom Typ 'Produkt' referenziert vom Geltungsbereich, aber es ist nicht definiert

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

ich diese Funktion wie folgt aufrufen:

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

Aufruf Load aus BindData wirft die Ausnahme:

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

Wie kann Ich löse das auf.

EDIT: - indem sie durch SubSonic Code Schritt fand ich, dass der Fehler durch diese Funktion

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

Sieht aus wie ein Fehler in SubSonic. (@Kobi: Nr.) – Timwi

+0

@Timwi jede Umgehungslösung das? – TheVillageIdiot

Antwort

13

Nach schlug meinen Kopf an der Wand für viele Tage und auch nur zu fragen Jon Skeet um Hilfe geworfen wird, fand ich heraus, das Problem.

Das Problem ist eigentlich mit SubSonic (@Timwi hatte Recht). Es ist richtig, in dieser Zeile:

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

alles gut war:

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

Nachdem ich es geändert.

+5

Wissen Sie, warum das ein Problem war? – mat

+2

Dies ist der Top-Hit für die Fehlermeldung, leider, da dies nicht wirklich eine Antwort auf das Problem der meisten ist, einschließlich mir und @ user1039462. Für mich war das Problem, dass Sie den ParameterExpression * überall * verwenden müssen. Es ist ** nicht genug **, dass die ParameterExpression denselben Variablennamen hat. Ich glaubte, dass es war, aber ich würde die Ausnahme über Bereich erhalten, weil ich nicht dieselbe Instanz von ParameterExpression in meinem Ausdrucksbaum und in der Wurzel LambdaExpression war. – Will

+0

@Will das Problem in SubSonic war. Es hat den Variablenwert nicht gesetzt, wenn er nicht explizit festgelegt wurde. – TheVillageIdiot

Verwandte Themen