Me gustaría saber cómo ser capaz de hacer un árbol de expresión mediante la introducción de más de un parámetrovarias condiciones en lambda expresiones en tiempo de ejecución C#
Ejemplo:
dataContext.Users.Where(u => u.username == "Username" && u.password == "Password")
En el momento en que el código que yo era la siguiente, pero le gustaría hacer más general en cuanto a si la condición es OR o AND
public Func<TLinqEntity, bool> ANDOnlyParams(string[] paramNames, object[] values)
{
List<ParameterExpression> paramList = new List<ParameterExpression>();
foreach (string param in paramNames)
{
paramList.Add(Expression.Parameter(typeof(TLinqEntity), param));
}
List<LambdaExpression> lexList = new List<LambdaExpression>();
for (int i = 0; i < paramNames.Length; i++)
{
if (i == 0)
{
Expression bodyInner = Expression.Equal(
Expression.Property(
paramList[i], paramNames[i]),
Expression.Constant(values[i]));
lexList.Add(Expression.Lambda(bodyInner, paramList[i]));
}
else
{
Expression bodyOuter = Expression.And(
Expression.Equal(
Expression.Property(
paramList[i], paramNames[i]),
Expression.Constant(values[i])),
Expression.Invoke(lexList[i - 1], paramList[i]));
lexList.Add(Expression.Lambda(bodyOuter, paramList[i]));
}
}
return ((Expression<Func<TLinqEntity, bool>>)lexList[lexList.Count - 1]).Compile();
}
Gracias
En cuanto a por qué estoy yendo por el camino difícil (devolver un delegado), la razón es que no tienen acceso directo a los nombres de las columnas de la base de datos en tiempo de diseño. Y no puedo acceder usando datacontext.table.Where (...); porque tengo los nombres de las tablas encriptados dentro de la base de datos. Gracias por su respuesta, buscaré el método AndAlso ... – Ryan
@Ryan - ver actualización - ¡Recordé la biblioteca que hace esto! –
Gracias Daniel ... Realmente aprecio que parece exactamente lo que necesito :) – Ryan