Sto scrivendo un piccolo progetto usando .net Core ed Entity Framework.
Ho bisogno di implementare il filtro dinamico per IQueryable<T>
.
Ho enumerazioni che definiscono gli operatori
public enum QueryOperatorEnums
{
Equal = 0,
NotEqual = 1,
Constant = 2,
LessThan = 3,
GreaterThan = 4,
LessThanOrEqual = 5,
GreaterThanOrEqual = 6,
}
E ho un'estensione di IQueryable
:
public static IQueryable<T> Filter<T>(this IQueryable<T> query, Dictionary<string, KeyValuePair<QueryOperatorEnums, object>> keyValuePairs)
{
if (keyValuePairs == null)
return query;
foreach (var keyValuePair in keyValuePairs)
{
var propertyInfo = typeof(T).GetProperty(keyValuePair.Key);
if (propertyInfo != null)
{
var operation = keyValuePair.Value;
switch (operation.Key)
{
case QueryOperatorEnums.Constant:
break;
case QueryOperatorEnums.Equal:
query = query.Where(obj => propertyInfo.GetValue(obj, null).Equals(operation.Value));
break;
case QueryOperatorEnums.GreaterThan:
break;
case QueryOperatorEnums.GreaterThanOrEqual:
break;
case QueryOperatorEnums.LessThan:
break;
case QueryOperatorEnums.LessThanOrEqual:
break;
case QueryOperatorEnums.NotEqual:
break;
default:
break;
}
}
}
return query;
}
Cosa posso fare per implementare casi speciali? Perché il valore della proprietà è dinamico in fase di esecuzione. Non riesco a rilevare il tipo da usare <=
, >=
...
Grazie per il vostro sostegno
Come hai visto, non puoi usare la riflessione.
Tuttavia, 2 librerie di terze parti possono aiutarti in questo
https://www.nuget.org/packages/System.Linq.Dynamic.Core/
La sintassi richiesta è leggermente diversa da C # ma funziona alla grande. È la biblioteca più popolare per fare una cosa del genere.
Disclaimer : sono il proprietario del progetto C # Eval Expression
La libreria non è gratuita, ma puoi fare praticamente qualsiasi LINQ dinamico usando la stessa sintassi di C #.
Quindi sarai in grado di costruire una stringa da valutare e la libreria farà il resto per te.
Ecco alcuni esempi usando EF Classic:
Dynamic Linq funziona con MySql, Sql Server e Postgresql, Jonathan?
Sì, non vedo perché non potrebbe funzionare. Sotto il cofano, viene generata l'espressione LINQ come si potrebbe chiamare a mano.