Как мне просто LINQ Join () связать два IQueryables? - PullRequest
14 голосов
/ 08 октября 2010

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

Ингредиент:

IngId
Description

AvailableIngredient:

IngId

Я ужеиметь IQueryable для ингредиента:

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

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

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

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

  • GetAvailableIngredientQuery возвращает запрос доступных ингредиентов, то есть 3000 из 6000 (но он не перечисляет результатытем не менее, поскольку он возвращается как IQueryable из EF)
  • Присоедините availableQuery к 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;
}

1 Ответ

19 голосов
/ 08 октября 2010

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

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