2010-10-08 27 views
12

Tôi có hai IQueryables:Làm thế nào để tôi chỉ LINQ Join() để liên kết hai IQueryables?

Ingredient:

IngId 
Description 

AvailableIngredient:

IngId 

Tôi đã có một IQueryable cho Ingredient:

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

Làm cách nào để tôi có thể thêm tham gia vào bộ lọc của mình để nó lọc theo AvailableIngredient (tức là một bên trong tham gia)? Tôi biết làm thế nào để làm điều đó nếu tôi phải tham gia tất cả các thời gian, tức là từ ... tham gia context.Available ... vv), nhưng Tham gia là có điều kiện, vì vậy tôi cần phải sử dụng cú pháp khác:

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

điều này có thể không phải là phương pháp đúng, vì vậy đây là những gì tôi muốn làm:

  • GetAvailableIngredientQuery trả các thành phần sẵn truy vấn, tức là 3000 của 6000 (nhưng nó không liệt kê các kết quả chưa như nó là được trả lại dưới dạng IQueryable từ EF)
  • Tham gia vào availableQuery đến ingQuery, do đó một Inner Tham gia giữa hai truy vấn

EDIT:

này được mã Tôi hiện đang sử dụng (rất nhanh), nhưng nó có nghĩa là mã trùng lặp :

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

Trả lời

16

Sử dụng truy vấn đầu tiên làm nguồn truy vấn tiếp theo.

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

Đó là những gì tôi đã có. Đọc bản chỉnh sửa của tôi (được đưa ra trước câu trả lời của bạn) và nó gây ra rất nhiều sự trùng lặp. Ngoài ra, đó là cú pháp không hợp lệ. Bạn không thể sử dụng '==' nó phải là 'bằng'. Dù sao cũng cảm ơn bạn. – GenericTypeTea

+0

Thử giải pháp mới. Phải đã bỏ lỡ chỉnh sửa trước đó của bạn ... – Clicktricity

+0

Cảm ơn, chắc chắn có vẻ như nó sẽ làm việc (Tôi không biết tại sao tôi đã thử này)! Thật không may tôi đang ở trong một trạng thái hoàn toàn không thể xây dựng vào lúc này, vì vậy tôi sẽ cố gắng trong một chút. – GenericTypeTea

Các vấn đề liên quan