c# - dinamico - Dinámico donde condición en LINQ
linq expression builder c# (5)
Consulte la publicación completa del blog: consulta dinámica con Linq
Hay dos opciones que puede usar:
string condition = string.Empty;
if (!string.IsNullOrEmpty(txtName.Text))
condition = string.Format("Name.StartsWith(/"{0}/")", txtName.Text);
EmployeeDataContext edb = new EmployeeDataContext();
if(condition != string.empty)
{
var emp = edb.Employees.Where(condition);
///do the task you wnat
}
else
{
//do the task you want
}
El generador de predicados funciona de forma similar a la biblioteca Dynamic LINQ pero es seguro de tipo:
var predicate = PredicateBuilder.True<Employee>();
if(!string.IsNullOrEmpty(txtAddress.Text))
predicate = predicate.And(e1 => e1.Address.Contains(txtAddress.Text));
EmployeeDataContext edb= new EmployeeDataContext();
var emp = edb.Employees.Where(predicate);
diferencia entre la biblioteca de arriba:
- PredicateBuilder permite construir consultas dinámicas seguras .
- La biblioteca Dynamic LINQ permite construir consultas con cláusulas Where y OrderBy dinámicas especificadas mediante cadenas .
Tengo un escenario en el que tengo que usar una condición dinámica en LINQ.
Quiero algo como esto:
public void test(bool flag)
{
from e in employee
where e.Field<string>("EmployeeName") == "Jhom"
If (flag == true)
{
e.Field<string>("EmployeeDepartment") == "IT"
}
select e.Field<string>("EmployeeID")
}
Sé que no podemos usar el ''Si'' en el medio de la consulta de Linq, pero ¿cuál es la solución para esto?
Por favor ayuda...
Entonces, si la flag
es false
necesitas todos los Jhoms, y si la flag
es verdadera solo necesitas Jhoms en el departamento de TI
Esta condición
!flag || (e.Field<string>("EmployeeDepartment") == "IT"
cumple ese criterio (siempre es cierto si el indicador es falso, etc.), por lo que la consulta se convertirá en:
from e in employee
where e.Field<string>("EmployeeName") == "Jhom"
&& (!flag || (e.Field<string>("EmployeeDepartment") == "IT")
select e.Field<string>("EmployeeID")
Además, este e.Field<string>("EmployeeID")
, huele a softcoding , podría echar un vistazo a eso. supongo
from e in employee
where e.EmployeeName == "Jhom"
&& (!flag || (e.EmployeeDepartment == "IT")
select e.EmployeeID
sería más compacto y menos propenso a errores de tipeo.
EDITAR: Esta respuesta funciona para este escenario particular. Si tiene muchas de estas consultas, investigue los patrones propuestos en las otras respuestas.
Puede encadenar métodos:
public void test(bool flag)
{
var res = employee.Where( x => x.EmployeeName = "Jhom" );
if (flag)
{
res = res.Where( x => x.EmployeeDepartment == "IT")
}
var id = res.Select(x => x.EmployeeID );
}
Puede llamar métodos LINQ explícitamente y encadenarlos condicionalmente.
public IEnumerable<string> FilterEmployees (IEnumerable<Employee> source, bool restrictDepartment)
{
var query = source.Where (e => e.Field<string>("EmployeeName") == "Jhom");
if (restrictDepartment) // btw, there''s no need for "== true"
query = query.Where (e => e.Field<string>("EmployeeDepartment") == "IT");
return query.Select (e => e.Field<string>("EmployeeID"));
}
from e in employee
where e.Field<string>("EmployeeName") == "Jhom" &&
(!flag || e.Field<string>("EmployeeDepartment") == "IT")
select e.Field<string>("EmployeeID")