2011-01-12 9 views
11

Ho una classe denominata Product nel progetto di libreria di classi. Sto usando SubSonic SimpleRepository per persistere oggetti. Ho un metodo come segue Product classe:variabile "x" di tipo "Prodotto" a cui si fa riferimento dall'ambito, ma non è definita

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

sto chiamando questa funzione come questa:

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

Calling Load dal BindData genera l'eccezione:

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

Come può Risolvo questo.

EDIT: - facendo un passo attraverso SubSonic codice che ho trovato che l'errore è gettato da questa funzione

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

Sembra un bug in SubSonic. (@Kobi: No.) – Timwi

+0

@Timwi non ci sono soluzioni alternative? – TheVillageIdiot

risposta

13

Dopo sbattere la testa contro il muro per molti giorni e nemmeno chiedere Jon Skeet aiuto, ho scoperto il problema.

Il problema è in realtà con SubSonic (@Timwi aveva ragione). E 'proprio in questa linea:

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

Dopo ho cambiato in:

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

tutto andava bene.

+5

Sai perché questo era un problema? – mat

+2

Questo è il colpo più alto per il messaggio di errore, sfortunatamente, poiché questa non è davvero una risposta al problema che molti stanno avendo, inclusi me e @ user1039462. Per me, il problema era che devi usare lo stesso ParameterExpression * ovunque *. È ** non sufficiente ** che ParameterExpression abbia lo stesso nome di variabile. Credevo che lo fosse, ma avrei ottenuto un'eccezione riguardo l'ambito perché non ero la stessa istanza di ParameterExpression nella mia struttura di espressioni e nella radice LambdaExpression. – Will

+0

@Will il problema era in SubSonic. Non stava impostando il valore della variabile se non impostato in modo esplicito. – TheVillageIdiot

Problemi correlati