Estoy tratando de encontrar una manera de consultar un objeto en mi modelo de datos e incluir solo aquellos parámetros que no son nulos. Como a continuación:Implementando sentencias 'if' condicionales dentro de una instrucción LINQ 'where'
public List<Widget> GetWidgets(string cond1, string cond2, string cond3)
{
MyDataContext db = new MyDataContext();
List<Widget> widgets = (from w in db.Widgets
where
... if cond1 != null w.condition1 == cond1 ...
... if cond2 != null w.condition2 == cond2 ...
... if cond3 != null w.condition3 == cond3 ...
select w).ToList();
return widgets;
}
Desde la mesa widgets pueden ser muy grandes, me gustaría evitar hacer esto:
public List<Widget> GetWidgets(string cond1, string cond2, string cond3)
{
MyDataContext db = new MyDataContext();
List<Widget> widgets = db.Widgets.ToList();
if(cond1 != null)
widgets = widgets.Where(w => w.condition1 == cond1).ToList();
if(cond2 != null)
widgets = widgets.Where(w => w.condition2 == cond2).ToList();
if(cond3 != null)
widgets = widgets.Where(w => w.condition3 == cond3).ToList();
return widgets;
}
He mirado en varios ejemplos, pero realmente no veo nada que coincide con lo que tengo que hacer.
¿Es hasta el compilador JIT para deshacerse de los condicionales en la consulta resultante? ¿O 'linq' garantiza algunas optimizaciones? – xtofl
@xtofl: ¿no estás seguro de lo que quieres decir? ¿De qué condicionales querría deshacerse? –
Si no se cumplen las condiciones, no se agregan al árbol de expresiones. – Michael