2011-01-12 16 views
11

Tengo una clase llamada Product en proyecto de biblioteca de clase. Estoy usando SubSonic SimpleRepository para persistir objetos. Tengo un método de la siguiente manera en Product clase:variable 'x' del tipo 'Producto' al que se hace referencia desde el alcance, pero no está definido

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

Voy a llamar a esta función como esta:

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

Calling Load de BindData produce la excepción:

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

¿Cómo puede Resuelvo esto

EDIT: - paso a paso por SubSonic código que encontró que el error se produce por esta función

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

Parece un error en SubSonic. (@Kobi: No.) – Timwi

+0

@Timwi cualquier solución esto? – TheVillageIdiot

Respuesta

13

Después de golpearse la cabeza contra la pared durante muchos días e incluso pidiendo Jon Skeet en busca de ayuda, descubrí el problema.

El problema en realidad es con SubSonic (@Timwi tenía razón). Es justo en esta línea:

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

Después de haber cambiado a:

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

todo estaba bien.

+5

¿Sabes por qué esto fue un problema? – mat

+2

Este es el éxito principal del mensaje de error, desafortunadamente, ya que esta no es realmente una respuesta al problema que la mayoría está teniendo, incluyéndome a mí y @ user1039462. Para mí, el problema es que debes usar el mismo ParameterExpression * en todas partes *. ** No es suficiente ** que ParameterExpression tenga el mismo nombre de variable. Creía que era así, pero obtendría la excepción sobre el alcance porque no era la misma instancia de ParameterExpression en mi árbol de expresiones y en la raíz LambdaExpression. – Will

+0

@ Will el problema fue en SubSonic. No estaba estableciendo el valor de la variable si no se estableció explícitamente. – TheVillageIdiot

Cuestiones relacionadas