Sto costruendo una query LINQ dinamicamente con questo codice. Sembra funzionare, ma quando ho più di una searchString nella mia ricerca, (in modo che quando vengono aggiunti molteplici espressioni, ottengo il seguente errore:espressioni LINQ. Variabile 'p' di tipo referenziato dall'ambito, ma non è definito
Variable 'p' of type referenced from scope, but it is not defined**
Credo di poter definire solo/uso p una volta. ma, se è così, ho bisogno di modificare il mio codice un po '. qualcuno mi può punto nella giusta direzione qui?
if (searchStrings != null)
{
foreach (string searchString in searchStrings)
{
Expression<Func<Product, bool>> containsExpression = p => p.Name.Contains(searchString);
filterExpressions.Add(containsExpression);
}
}
Func<Expression, Expression, BinaryExpression>[] operators = new Func<Expression, Expression, BinaryExpression>[] { Expression.AndAlso };
Expression<Func<Product, bool>> filters = this.CombinePredicates<Product>(filterExpressions, operators);
IQueryable<Product> query = cachedProductList.AsQueryable().Where(filters);
query.Take(itemLimit).ToList(); << **error when the query executes**
public Expression<Func<T, bool>> CombinePredicates<T>(IList<Expression<Func<T, bool>>> predicateExpressions, Func<Expression, Expression, BinaryExpression> logicalFunction)
{
Expression<Func<T, bool>> filter = null;
if (predicateExpressions.Count > 0)
{
Expression<Func<T, bool>> firstPredicate = predicateExpressions[0];
Expression body = firstPredicate.Body;
for (int i = 1; i < predicateExpressions.Count; i++)
{
body = logicalFunction(body, predicateExpressions[i].Body);
}
filter = Expression.Lambda<Func<T, bool>>(body, firstPredicate.Parameters);
}
return filter;
}
Non capisco. Sembra che il tuo 'CombinePredicates' si aspetta espressioni' n' e operatori 'n-1'. Tuttavia, nel posto in cui lo si invoca, si dispone di un array di operatori con lunghezza pari a '1'. Mi aspetterei un'eccezione di uscire dai limiti dell'array se ci sono più di predicati '2' da unire. –
L'ho visto, ho tirato fuori alcune cose per rendere il mio esempio più compatto. Ma cambierò la mia domanda per rendere quella parte tecnicamente corretta. – Tys
Ho corretto quella parte.Ma il problema rimane come era. – Tys