2010-10-08 11 views
12

Tengo dos IQueryables:¿Cómo puedo simplemente LINQ Join() para vincular dos IQueryables?

Ingrediente:

IngId 
Description 

AvailableIngredient:

IngId 

ya tengo IQueryable por Ingrediente:

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

¿Cómo puedo agregar una unión a su filtro por AvailableIngredient (es decir una unión interna)? Sé cómo hacerlo si tuviera que unirme todo el tiempo, es decir, desde ... unir contexto. Disponible ... etc.), pero la unión es condicional, así que necesito 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:

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

EDIT:

El código actualmente estoy usando (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; 
} 

Respuesta

16

Utilice la primera consulta como origen de la consulta siguiente.

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; 
} 
+0

Eso es lo que ya he hecho. Lea mi edición (que vino antes de su respuesta), y causa una gran cantidad de duplicaciones. Además, esa es una sintaxis inválida. No puede usar '==' debe ser 'igual'. Gracias de cualquier manera. – GenericTypeTea

+0

Pruebe la nueva solución. Debes haber perdido tu edición anterior ... – Clicktricity

+0

Gracias, definitivamente parece que funcionará (no sé por qué lo intenté). Lamentablemente, estoy en un estado totalmente indestructible en este momento, así que lo intentaré un poco. – GenericTypeTea