15

私は2つのIQueryablesを持っています:

成分:

IngId
Description

利用可能な成分:

IngId

私はすでに Ingredient の IQueryable を持っています:

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

彼に結合を追加して、フィルター処理するAvailableIngredient(つまり、内部結合) にはどうすればよいですか? 常に参加する必要がある場合、つまり from... join context.Available... など) の方法は知っていますが、Join は条件付きであるため、他の構文を使用する必要があります。

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

これは正しい方法ではないかもしれないので、これが私がやりたいことです:

  • GetAvailableIngredientQuery は、利用可能な成分のクエリ、つまり 6000 のうち 3000 を返します (ただし、EF から IQueryable として返されるため、結果はまだ列挙されていません)。
  • availableQuery を ingQuery に結合して、2 つのクエリ間に内部結合があるようにします。

編集:

これは私が現在使用しているコードです(非常に高速です)が、重複したコードを意味します:

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

1 に答える 1

22

最初のクエリを後続のクエリのソースとして使用します。

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;
}
于 2010-10-08T11:00:56.067 に答える