簡體   English   中英

在LINQ中加入多個Critieria?

[英]Left Joins in LINQ with multiple Critieria?

如何為左連接添加其他條件? 在LINQ中,您只能有一個連接子句“x.id等於y.id”。 在內連接上,這沒有問題,只需將它們添加到where子句即可。 當您進行左連接時,這會在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

有任何想法嗎?

謝謝,史蒂夫

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

嘗試

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

你有兩個選擇。

首先,使用導航屬性。 我曾經問過為什么人們會在一段時間內使用連接而不是導航屬性 ,這些答案支持了我的理解 - 很少有真正的原因,而且通常是一個錯誤。 正如其他答案所示,使用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-to-SQL還是Entity Framework。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM