Подтвердить что ты не робот

Как мне связать LINQ Join(), чтобы связать два IQueryables?

У меня есть два IQueryables:

Ингредиенты:

IngId
Description

AvailableIngredient:

IngId

У меня уже есть IQueryable для Ingredient:

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

Как я могу добавить соединение к нему, поэтому он фильтрует AvailableIngredient (т.е. Inner Join)? Я знаю, как это сделать, если мне приходилось все время присоединяться, т.е. Из... join context.Available... и т.д.), Но Join является условным, поэтому мне нужно использовать другой синтаксис:

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

Это не может быть правильный метод, поэтому я хочу это сделать:

  • GetAvailableIngredientQuery возвращает запрос доступных ингредиентов, т.е. 3000 из 6000 (но это не перечислить результаты пока возвращается как IQueryable из EF)
  • Присоединяйся к доступному окну в ingQuery, так что есть Внутренняя связь между двумя запросами

EDIT:

Это код, который я сейчас использую (очень быстро), но это означает дублированный код:

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

Ответ 1

Использовать первый запрос в качестве источника последующего запроса.

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