Tengo un consultable donde he usado varias declaraciones Where
y WhereBetween
para reducir la colección a un cierto conjunto. Ahora Necesito agregar un tipo de Where || WhereBetween
. En otras palabras, no puedo encadenarlos como lo hice hasta ahora, porque eso funcionará como un Y. Entonces, ¿cómo puedo hacer esto?C#, Linq2Sql: ¿Es posible concatenar dos consultas en una?
veo dos posibilidades:
- Cree dos queryables de la que tengo, uno usando el
Where
, y el otro conWhereBetween
. Y luego concatenarlos. No sé si esto es posible? También, aunque no en mi caso particular, lo más probable es acabar con los duplicados ... - De alguna manera se funden la expresión
Where
y la expresión creada en elWhereBetween
con algún tipo de O.
La primera, como se ha mencionado, no estoy seguro es incluso posible. Y si lo fue, no estoy tan seguro de que sea una buena forma de hacerlo.
El segundo, puedo verlo como una opción, pero no estoy totalmente seguro de todos los detalles. A continuación se muestra el método de WhereBetween
de mi otra pregunta, que ahora utilizo y funciona muy bien:
public static IQueryable<TSource> WhereBetween<TSource, TValue>(
this IQueryable<TSource> source,
Expression<Func<TSource, TValue>> selector,
IEnumerable<Range<TValue>> ranges)
{
var param = Expression.Parameter(typeof(TSource), "x");
var member = Expression.Invoke(selector, param);
Expression body = null;
foreach (var range in ranges)
{
var filter = Expression.AndAlso(
Expression.GreaterThanOrEqual(member,
Expression.Constant(range.A, typeof(TValue))),
Expression.LessThanOrEqual(member,
Expression.Constant(range.B, typeof(TValue))));
body = body == null ? filter : Expression.OrElse(body, filter);
}
return body == null ? source : source.Where(
Expression.Lambda<Func<TSource, bool>>(body, param));
}
estoy pensando que tal vez podría extraer la parte de la construcción de expresión en un nuevo método. Tal como esto:
public static IQueryable<TSource> WhereBetween<TSource, TValue>(
this IQueryable<TSource> source,
Expression<Func<TSource, TValue>> selector,
IEnumerable<Range<TValue>> ranges)
{
return source.Where(WhereBetween(selector, ranges));
}
public static Expression<Func<TSource, bool>> WhereBetween<TSource, TValue>(
Expression<Func<TSource, TValue>> selector,
IEnumerable<Range<TValue>> ranges)
{
var param = Expression.Parameter(typeof(TSource), "x");
var member = Expression.Invoke(selector, param);
Expression body = null;
foreach (var range in ranges)
{
var filter = Expression.AndAlso(
Expression.GreaterThanOrEqual(member,
Expression.Constant(range.A, typeof(TValue))),
Expression.LessThanOrEqual(member,
Expression.Constant(range.B, typeof(TValue))));
body = body == null ? filter : Expression.OrElse(body, filter);
}
return body == null
? ø => true
: Expression.Lambda<Func<TSource, bool>>(body, param);
}
que podrían entonces utilizar ese nuevo método para obtener la expresión en lugar de la consultable. Entonces, digamos que tengo el WhereBetween(ø => ø.Id, someRange)
y por ejemplo ø => ø.SomeValue == null
. ¿Cómo puedo combinar esos dos con O? Estoy mirando el Expression.OrElse
utilizado en el método WhereBetween
, y creo que podría ser lo que necesito, o tal vez este el Expression.Or
. Pero soy muy inestable en esta expresión, así que no estoy seguro de qué elegir aquí, o incluso si estoy en el camino correcto: p
¿Podría alguien darme algunos consejos aquí?
Esa cosa fila podría ser cualquier cosa, ¿verdad?(Cualquier cadena que sea, por supuesto) – Svish
Pensando en el rendimiento sql y tal, ¿es más eficiente con un 'UNION' o un' OR' en la cláusula 'WHERE'? – Svish
Muy agradable. Esta pregunta sigue apareciendo (en variaciones) y tu OrElse podría ser la bala mágica que los resuelve a todos. –