2011-09-27 89 views
0

您如何爲左連接添加其他條件?在LINQ中,只能有一個連接子句「x.id equals y.id」。在內部連接上,這不成問題,只需將它們添加到where子句即可。當你正在做一個左連接時,這會在LINQ中產生問題。添加這個額外的標準似乎強迫它是一個內部聯接。左多個Critieria加入LINQ?

join s in db.tblCustomerPricingSchemes on c.CustomerID equals s.CustomerID into g1 
from s in g1.DefaultIfEmpty() 
join p in db.tblPricingSchemes on l.LangPairs equals p.PSLangPairID into g2 
from p in g2.DefaultIfEmpty() 
where t.JobID == jobID 
    //&& s.PSLangPairID == l.LangPairs 
    //&& p.PSDescID == c.PricingID 

任何想法?

謝謝你,史蒂夫

+0

這是實體框架還是linq-to-sql? –

回答

1
from s in db.tblCustomerPricingSchemes 
    .where(x => c.CustomerID == x.CustomerID && 
      x.PSLangPairID == l.LangPairs).DefaultIfEmpty() 
1

嘗試

from c in db.tblCustomer 
from s in db.tblCustomerPricingSchemes.Where(w => w.CustomerID == c.CustomerID).DefaultIfEmpty() 
from p in db.tblPricingSchemes.Where(w => w.PSLangPairID == l.LangPairs).DefaultIfEmpty() 
where t.JobID == jobID 
select c // etc 
0

你有兩個選擇。

首先,使用導航屬性。我回過頭問why people use joins instead of navigational properties,答案支持我的理解 - 很少有真正的原因,通常是一個錯誤。正如這裏的其他答案所示,使用一些where子句來過濾對象圖。

db.tblCustomerPricingSchemes.Where(x => condition).Select(scheme => 
    new { scheme, scheme.LangPair, scheme.LangPair.PricingScheme }); 

但是,如果你需要加入,那麼你嘗試通過做一些空檢查來允許在你的where子句中的外連接。

where t.JobID == jobID 
    && (s.PSLangPairID == null 
     || l.LangPairs == null 
     || s.PSLangPairID == l.LangPairs) 
    && (p.PSDescID == null 
     || c.PricingID == null 
     || p.PSDescID == c.PricingID) 

如果它是SQL您使用COALESCE操作,但不知道這是否會工作,也取決於您是否使用LINQ到SQL或實體框架。

&& (s.PSLangPairID ?? l.LangPairs) == l.LangPairs 
&& (p.PSDescID ?? c.PricingID) == c.PricingID 
+0

我喜歡downvotes的反饋。 –