如何为左连接添加其他条件?在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
有什么想法吗?
谢谢, 史蒂夫
答案 0 :(得分:1)
from s in db.tblCustomerPricingSchemes
.where(x => c.CustomerID == x.CustomerID &&
x.PSLangPairID == l.LangPairs).DefaultIfEmpty()
答案 1 :(得分: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
答案 2 :(得分: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-to-SQL还是Entity Framework。
&& (s.PSLangPairID ?? l.LangPairs) == l.LangPairs
&& (p.PSDescID ?? c.PricingID) == c.PricingID