0

我有多對多的產品(p)和材質(m)以及產品2材料表(p2m)中的多對多關係作爲多對多鏈接。使用LINQ Entity Framework進行多對多的全外連接

我需要得到

- all products that have materials assigned, 
- all products with no materials assigned, 
- and all materials with no products assigned. 

基本上什麼是有一個聯盟。 但是,由於這是數據過濾器,因此我需要過濾掉與搜索條件不匹配的產品和/或材料(例如,所有以「A」開頭的產品等)。

如何在LINQ-to-EF 4.1中執行此操作?

非常感謝!

+0

此時,由於全外的LINQ加入似乎是一個頭痛,我正在考慮一個將運行LINQ查詢的視圖。該視圖將具有必要的JOINS,並且LINQ查詢變得更容易。 – John

回答

0

Linq不直接提供完整的外連接操作,因此您的最佳選擇是嘗試單獨的左和右連接L2E查詢並將它們併入單個結果集。

我會嘗試像(未測試):

var query = (from p in context.Products 
      from m in p.Materials 
      select new { p, m }) 
      .Union(
      from m in context.Materials 
      from p in m.Products 
      select new { p, m }) 
      ... 

也許你將不得不使用DefaultIfEmpty強制執行外連接。

0

從你的描述,它看起來像你的實際需要:

  1. 所有產品
  2. 所有未使用的材料

你需要它作爲一個單一的IQueryable(如果是哪個領域你需要)或2 IQueryables?

+0

嗯,我真的需要所有的產品,是的,還有所有的材料,這取決於用戶的需求。用戶可以選擇他是否特別需要與產品相關的材料或尚未關聯的材料。 – John

0

下應該做的工作:

from m in context.Materials //m has to be the first 
from p in context.Products  
where !p.Select(p1 => p1.Material).Contains(m) || p.Material == null || p.Material == m 

對於性能,可能會更好如下:

var a = from p in context.Products select p.Material; 

var b = from m in context.Materials //m has to be the first 
     from p in context.Products  
     where a.Contains(m) || p.Material == null || p.Material == m 
相關問題