2010-10-08 6 views
12

Mam dwa IQueryables:Jak mogę po prostu LINQ Join() połączyć dwa IQueryables?

składnika:

IngId 
Description 

AvailableIngredient:

IngId 

Mam już IQueryable dla składnika:

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

Jak dodać do niego sprzężenie, aby filtrował przez AvailableIngredient (tj. Wewnętrzne dołączenie)? Wiem, jak to zrobić, gdybym musiał dołączyć cały czas, tj. Z ... dołączenia do kontekstu.Dostępne ... itd.), Ale dołączenie jest warunkowe, więc potrzebuję użyć innej składni:

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

ten nie może być dobrym sposobem, aby to, co chcę zrobić:

  • GetAvailableIngredientQuery zwraca dostępnych składników zapytanie, tj 3000 z 6000 (ale nie wyliczać jeszcze wyniki jako to jest zwrócony jako IQueryable z EF)
  • Dołącz do availableQuery do ingQuery, więc istnieje sprzężenie wewnętrzne między dwoma zapytaniami

EDIT:

Jest to kod obecnie używam (bardzo szybko), to znaczy, ale kod powielony :

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

Odpowiedz

16

Użyj pierwszego zapytania jako źródła kolejnego zapytania.

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

To już mam. Czytaj moją edycję (która pojawiła się przed twoją odpowiedzią), i powoduje to ogromną duplikację. Jest to również nieprawidłowa składnia. Nie możesz użyć '==' musi być 'równa się'. Dzięki i tak. – GenericTypeTea

+0

Wypróbuj nowe rozwiązanie. Musiałeś przegapić twoją wcześniejszą edycję ... – Clicktricity

+0

Dzięki, na pewno wygląda na to, że zadziała (nie wiem, dlaczego to wypróbowałem)! Niestety, w tej chwili jestem w stanie całkowicie nietrwałym, więc spróbuję trochę. – GenericTypeTea