Szűrés opcionális paraméterekre LINQ-val
Tuesday, December 8th, 2009A feladvány, hogy van sok szűrési feltétel, ezekre szűrni kell, ha van érvényes értékük, vagy kihagyni a szűrésből, ha nincs.
A feladatra SQL Server esetén bool algebrás megoldást írnék:
select * from tabla where (@p1 is null) or (@p1 = col1) and (@p2 is null) or (@p2 = col2) ... option(recompile)
Az option hint azért kell, mert így a nullos paraméterek teljesen kiesnek a tervből, csak a valódi szűrésekre készül terv. Ez szerintem óriási dolog, érdemes észben tartani.
Ugyanezt a logikát linqval is el lehet játszani, ref típusokkal kb. így:
var x = from z in Valami where (p1 == null) || (p1 = z.col1) && (p2 == null) || (p2 = z.col2)
Egy másik megoldásban azt használjuk ki, hogy késleltetett módon értékelődnek ki a kifejezések, így lehet őket láncolni. Itt látható ez a megoldás, és még más megközelítések is.
A harmadik megoldásban írhatunk egy saját szűrő operátort is erre a célra. Az előbbi címről:
public static IQueryable<TSource> WhereIf<TSource>(
this IQueryable<TSource> source, bool condition,
Expression<Func<TSource, bool>> predicate)
{
if (condition)
return source.Where(predicate);
else
return source;
}
Nehéz megindokolni, melyik megoldás a jobb.