Una soluzione è quella di utilizzare Dynamic Linq Library, usando questa libreria si può avere:
filterTable = //some code to retrive it
var whereClause = string.Join(" AND ", filterTable.Select(x=> x.Left + x.Right));
var result = context.People.Where(whereClause).ToList();
Supponendo che tabella filtro ha colonne Left
e Right
e si desidera unire i filtri per AND
.
mio suggerimento è di includere ulteriori dati nella tabella di filtro, ad esempio separare gli operatori operandi e aggiungere una colonna che determina il join è And
o OR
ed una colonna che determina l'altra riga che unisce questa. Hai bisogno di una struttura ad albero se vuoi gestire query più complesse come (A and B)Or(C and D)
.
Un'altra soluzione è creare un albero di espressioni dalla tabella dei filtri. Ecco un semplice esempio:
var arg = Expression.Parameter(typeof(People));
Expression whereClause;
for(var row in filterTable)
{
Expression rowClause;
var left = Expression.PropertyOrField(arg, row.PropertyName);
//here a type cast is needed for example
//var right = Expression.Constant(int.Parse(row.Right));
var right = Expression.Constant(row.Right, left.Member.MemberType);
switch(row.Operator)
{
case "=":
rowClause = Expression.Equal(left, right);
break;
case ">":
rowClause = Expression.GreaterThan(left, right);
break;
case ">=":
rowClause = Expression.GreaterThanOrEqual(left, right);
break;
}
if(whereClause == null)
{
whereClause = rowClause;
}
else
{
whereClause = Expression.AndAlso(whereClause, rowClause);
}
}
var lambda = Expression.Lambda<Func<People, bool>>(whereClause, arg);
context.People.Where(lambda);
questo è esempio molto semplificato, si dovrebbe fare molti convalide tipo casting e ... al fine di rendere questo funziona per tutti i tipi di query.
fonte
2015-08-21 08:27:13
Con il framework entità è possibile utilizzare la funzione Where in questo modo: ob.Where (p => p.age> 70 && gender == "male"). – MaticDiba
l'età e i 70 sono filtri di stringa che vengono recuperati dal DB. quindi, come posso scrivere questa riga di codice?Leggi di nuovo la domanda per favore. Grazie. – ConductedClever
Puoi usare questo [expression builder] (http://www.codeproject.com/Tips/582450/Build-Where-Clause-Dynamically-in-Linq) –