Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# LINQ中具有多个临界点的左连接?_C#_Linq_Entity Framework_Linq To Sql - Fatal编程技术网

C# LINQ中具有多个临界点的左连接?

C# LINQ中具有多个临界点的左连接?,c#,linq,entity-framework,linq-to-sql,C#,Linq,Entity Framework,Linq To Sql,如何向左联接添加其他条件?在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.tblPrici

如何向左联接添加其他条件?在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
有什么想法吗

谢谢, 史蒂夫

试试看

你有两个选择

首先,使用导航属性。我问了很久,答案支持了我的理解——很少有真正的原因,通常是错误的。正如这里的其他答案所建议的,使用一些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,则使用合并运算符,但不确定这是否有效,这取决于您使用的是LINQtoSQL还是实体框架

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

这是实体框架还是linq到sql?
where t.JobID == jobID
    && (s.PSLangPairID == null 
        || l.LangPairs == null 
        || s.PSLangPairID == l.LangPairs)
    && (p.PSDescID == null 
        || c.PricingID == null
        || p.PSDescID == c.PricingID)
&& (s.PSLangPairID ?? l.LangPairs) == l.LangPairs
&& (p.PSDescID ?? c.PricingID) == c.PricingID