2011-09-27 91 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的反馈。 –