2011-01-12 11 views
11

Mam klasę o nazwie Product w projekcie biblioteki klas. Używam SubSonic SimpleRepository do utrwalania obiektów. Mam metodę w następujący Product Klasa:Zmienna "x" typu "Produkt" przywoływana z zakresu, ale nie jest zdefiniowana

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

Dzwonię tę funkcję tak:

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

Wywołanie Load z BindData rzuca wyjątek:

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

Jak można Rozwiązuję to.

EDIT: - poprzez wzmocnienie poprzez kod SubSonic znalazłem, że błąd jest generowany przez tę funkcję

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

Wygląda jak błąd w SubSonic. (@Kobi: Nie) – Timwi

+0

@ Timwi jakiekolwiek obejście tego? – TheVillageIdiot

Odpowiedz

13

Po walić głową o ścianę przez wiele dni, a nawet prosząc Jon Skeet o pomoc, I okazało się, problem.

Problem w rzeczywistości dotyczy SubSonic (@Timwi miał rację). Jest w tym wierszu:

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

Po zmieniłem go na adres:

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

wszystko było dobrze.

+5

Czy wiesz, dlaczego to był problem? – mat

+2

To jest najlepsze trafienie dla komunikatu o błędzie, niestety, ponieważ nie jest to tak naprawdę odpowiedź na problem, który większość ma, w tym ja i @ user1039462. Dla mnie problemem było to, że musisz użyć tego samego parametru ParameterExpression * wszędzie *. To ** za mało **, że parametr Parametryczna ma taką samą nazwę zmiennej. Wierzyłem, że tak, ale dostałem wyjątek dotyczący zakresu, ponieważ nie byłem tym samym wystąpieniem ParameterExpression w moim drzewie ekspresji i root LambdaExpression. – Will

+0

@Opróżnienie było w SubSonic. To nie było ustawianie wartości zmiennej, jeśli nie jest jawnie ustawione. – TheVillageIdiot

Powiązane problemy