Pregunta

Tengo dos IQueryables:

Ingredientes:

IngId
Description

AvailableIngredient:

IngId

Ya tengo una IQueryable por Ingrediente:

var ingQuery = from i in context.Ingredients
               select i;

¿Cómo añadir una unión a su por lo que los filtros por AvailableIngredient (Join es decir, un interior)? Yo sé cómo hacerlo si tuviera que unir todo el tiempo, es decir, desde ... unirse a context.Available ... etc), pero la unión es condicional, así que tengo que usar la otra sintaxis:

if (filterByAvailable)
{
   IQueryable<Available> availableQuery = GetAvailableIngredientQuery(context);
   ingQuery = ingQuery.Join(...); // Can I use this to join to the query?
}

Esto puede no ser el método correcto, así que esto es lo que quiero hacer:

  • retornos GetAvailableIngredientQuery Los ingredientes de consulta disponibles, es decir, 3000 de 6000 (pero no lo hace enumerar los resultados sin embargo, ya que es devuelto como un IQueryable de EF)
  • Únete a la availableQuery a la ingQuery, por lo que hay una unión interna entre las dos consultas

EDIT:

Este es el código que estoy usando actualmente (muy rápido), pero significa código duplicado:

IQueryable<Ingredient> query;
if (filterByAvailable)
{
    IQueryable<Available> availableQuery = GetAvailableIngredientQuery(context);
    query = from item in context.Ingredients
               // Quite a few `where` clauses and stuff
            join t in availableQuery on item.IngId equals t.IngId
            select item;
}
else
{ 
    query = from item in context.Ingredients
               // The SAME `where` clauses and stuff as above
            select item;
}
¿Fue útil?

Solución

Usar la primera consulta como el origen de la consulta posterior.

IQueryable<Ingredient> query = from item in context.Ingredients
                             // Quite a few `where` clauses and stuff
                               select item;

if (filterByAvailable)
{
    IQueryable<Available> availableQuery = GetAvailableIngredientQuery(context);
    query = from item in query
            join t in availableQuery on item.IngId equals t.IngId
            select item;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top