Domanda

Ho due IQueryables:

Ingrediente:

IngId
Description

AvailableIngredient:

IngId

Ho già un IQueryable per Ingrediente:

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

Come posso aggiungere un join alla sua in modo che i filtri da AvailableIngredient (vale a dire un INNER JOIN)? So come si fa se dovessi aderire tutto il tempo, vale a dire da ... unirsi context.Available ... ecc), ma la registrazione è subordinata, quindi ho bisogno di usare l'altra sintassi:

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

Questo non può essere il metodo giusto, quindi questo è quello che voglio fare:

  • rendimenti GetAvailableIngredientQuery la query ingredienti a disposizione, vale a dire 3000 del 6000 (ma non è così enumerare i risultati ancora come è restituito come IQueryable da EF)
  • Partecipa alla availableQuery al ingQuery, quindi non c'è un inner join tra le due query

Modifica

Questo è il codice Attualmente sto usando (molto veloce), ma significa codice duplicato:

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;
}
È stato utile?

Soluzione

Usa la prima query come fonte dell'interrogazione successiva.

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;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top