views:

45

answers:

1

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;
}
+1  A: 

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;
}
Clicktricity
@Clicktricity - That's what I have already. Read my edit (which came before your answer), and it causes a great deal of duplication. Also, that's invalid syntax. You cannot use `==` it must be `equals`. Thanks anyway.
GenericTypeTea
Try the new solution. Must have missed your earlier edit ...
Clicktricity
Thanks, definately looks like it'll work (I don't know why I did try this)! Unfortunately I'm in a totally unbuildable state at the moment, so I'll try in a bit.
GenericTypeTea
Spot on. Thank you very much!
GenericTypeTea