Ho creato un BindingList filtrabile from this source. Funziona alla grande:Come creare un System.Linq.Expressions.Expression per Like?
list.Filter("Customer == 'Name'");
fa quello che dovrebbe. Gli interni funzionano come un parser, che converte l'espressione ==
o !=
in System.Linq.Expressions.Expression
. In questo caso, ==
diventa System.Linq.Expressions.Expression.Equal
.
Sfortunatamente System.Linq.Expressions.Expression
non contiene un operatore simile e non so come risolvere questo problema.
Il codice iniziale è simile al seguente:
private static Dictionary<String, Func<Expression, Expression, Expression>>
binaryOpFactory = new Dictionary<String, Func<Expression, Expression, Expression>>();
static Init() {
binaryOpFactory.Add("==", Expression.Equal);
binaryOpFactory.Add(">", Expression.GreaterThan);
binaryOpFactory.Add("<", Expression.LessThan);
binaryOpFactory.Add(">=", Expression.GreaterThanOrEqual);
binaryOpFactory.Add("<=", Expression.LessThanOrEqual);
binaryOpFactory.Add("!=", Expression.NotEqual);
binaryOpFactory.Add("&&", Expression.And);
binaryOpFactory.Add("||", Expression.Or);
}
Poi ho creato un'espressione che farà quello che voglio:
private static System.Linq.Expressions.Expression<Func<String, String, bool>>
Like_Lambda = (item, search) => item.ToLower().Contains(search.ToLower());
private static Func<String, String, bool> Like = Like_Lambda.Compile();
esempio
Console.WriteLine(like("McDonalds", "donAld")); // true
Console.WriteLine(like("McDonalds", "King")); // false
Ma binaryOpFactory
richiede questo:
Func<Expression, Expression, Expression>
Le espressioni predefinite sembrano essere esattamente questo:
System.Linq.Expressions.Expression.Or;
Qualcuno può dirmi come convertire la mia espressione?
E come il vostro simile opera? Posso aiutarti a creare un'espressione, ma ho bisogno di capire come vuoi che funzioni prima ... regex? contiene? eccetera? –
Non importa. L'implementazione finale sarà propiziamente con regexp. Fondamentalmente ho un Func a cui passo 2 Strings e ottengo true o false come returnvalue. Il mio problema è che non capisco l'implementazione di oggetti in System.Linq.Expressions.Expression Namespace, che sembrano essere Func (guarda i generici argements di binaryOpFactory) quindi non posso creare il mio confronto. –
Re commento: la comprensione dell'API di Expression può richiedere un po 'di attività ... Cerco di illustrare alcune nozioni di base sul mio blog; Anche il libro di Jon (C# in Depth) offre una panoramica di alto livello. –