Search code examples
linqjoinc#-4.0entity-framework-4ef-code-first

How do I just LINQ Join() to link two IQueryables?


I have two IQueryables:

Ingredient:

IngId
Description

AvailableIngredient:

IngId

I already have an IQueryable for Ingredient:

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

How can I add a join to his so it filters by AvailableIngredient (i.e. an Inner Join)? I know how to do it if I had to join all the time, i.e. from... join context.Available... etc), but the Join is conditional, so I need to use the other syntax:

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

This may not be the right method, so this is what I want to do:

  • GetAvailableIngredientQuery returns the available ingredients query, i.e. 3000 of 6000 (but it doesn't enumerate the results yet as it's returned as an IQueryable from EF)
  • Join the availableQuery to the ingQuery, so there's an Inner Join between the two queries

EDIT:

This is the code I'm currently using (very fast), but it means duplicated code:

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

Solution

  • Use the first query as the source of the subsequent query.

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