做一个LEFT OUTER JOIN在LINQ查询

问题描述:

我有下面的查询中sqllite工作与左外连接做一个LEFT OUTER JOIN在LINQ查询

 select * from customer cu 
     inner join contract cnt on cu.customerId = cnt.customerid 
     inner join address addy on cu.addressid = addy.addressId 
     inner join csrAssoc cassc on cu.customerid = cassc.customerId 
     left outer join CustomerServiceRepresentative csrr on cassc.csrid = csrr.customerservicerepresentativeId 
     inner join customerServiceManager csmm on cassc.csmid = csmm.customerservicemanagerId 
     where cu.customernumber = '22222234' 

我希望能够在LINQ申请一个左外连接在这条线查询低于

 join csrr in objCsrCustServRep.AsEnumerable() on cassc.CsrId equals 
            csrr.CustomerServiceRepresentativeId 

     VisitRepData = (from cu in objCustomer.AsEnumerable() 
           join cnt in objContract.AsEnumerable() on cu.customerId equals cnt.customerId 
           join addy in objAddress.AsEnumerable() on cu.addressId equals addy.addressId 
           join cassc in objCsrAssoc.AsEnumerable() on cu.customerId equals cassc.CustomerId 
           join csrr in objCsrCustServRep.AsEnumerable() on cassc.CsrId equals 
            csrr.CustomerServiceRepresentativeId 
           join csmm in objCustServMan on cassc.CsmId.ToString() equals csmm.customerServiceManagerId 
           where cu.CustomerNumber == (customernbr) 

如何在linq查询中执行左外连接?

这是我的意见,调整和运行代码后。另一部分也被添加。我所得到的是对象没有设置为对象的实例。

  var VisitRepData = from cu in objCustomer.AsEnumerable() 
           join cnt in objContract.AsEnumerable() on cu.customerId equals cnt.customerId 
           join addy in objAddress.AsEnumerable() on cu.addressId equals addy.addressId 
           join cassc in objCsrAssoc.AsEnumerable() on cu.customerId equals cassc.CustomerId 
           join csrr in objCsrCustServRep.AsEnumerable() on cassc.CsrId equals 
            csrr.CustomerServiceRepresentativeId into temp 
           from tempItem in temp.DefaultIfEmpty() 
           join csmm in objCustServMan on cassc.CsmId.ToString() equals csmm.customerServiceManagerId 
           where cu.CustomerNumber == (customernbr) 
           select new 
           { 
            cu.customerId, 
            cu.CustomerNumber, 
            cu.customerName, 
            cu.dateActive, 
            cnt.contractExpirationDate, 
            addy.street, 
            addy.street2, 
            addy.city, 
            addy.state, 
            addy.zipcode, 
            cu.EMail, 
            cu.phoneNo, 
            cu.faxNumber, 
            csmm.customerServiceManagerName, 
            tempItem.CustomerServiceRepresentativeName, 
           }; 

          foreach (var item in VisitRepData) 
          { 
           var one = item.customerId; 
           var two = item.CustomerNumber; 
          } 
+4

可能的[LINQ OUTER JOIN]中的重复(http://stackoverflow.com/questions/3404975/left-outer-join-in-linq) –

+0

没有在您的链接中标记为答案。 – user2320476

+1

对于你来说,是不是有216个upvotes来阅读答案?没有考虑到这个问题是非常基本的,并且缺乏基础研究 - [join clause(C#Reference)](https://msdn.microsoft.com/zh-cn/library/bb311040.aspx),[如何执行:左外连接(C#编程指南)](https://msdn.microsoft.com/en-us/library/bb397895.aspx)等。 –

documentation

左外连接是一个连接,其中第一集合中的每个元素被返回,而不管其是否具有所述第二集合中的任何相关的元件。 可以使用LINQ通过调用上的一组结果的DefaultIfEmpty方法执行左外连接连接

(重点煤矿)基于MSDN链接

以上,如果我理解您的要求正确,查询应该是这样的:

VisitRepData = from cu in objCustomer.AsEnumerable() 
          join cnt in objContract.AsEnumerable() on cu.customerId equals cnt.customerId 
          join addy in objAddress.AsEnumerable() on cu.addressId equals addy.addressId 
          join cassc in objCsrAssoc.AsEnumerable() on cu.customerId equals cassc.CustomerId 
          join csrr in objCsrCustServRep.AsEnumerable() on cassc.CsrId equals 
           csrr.CustomerServiceRepresentativeId into temp 
          from tempItem in temp.DefaultIfEmpty() 
          join csmm in objCustServMan on cassc.CsmId.ToString() equals csmm.customerServiceManagerId 
          where cu.CustomerNumber == (customernbr) 

具体来说,左外连接与该代码执行:

join csrr in objCsrCustServRep.AsEnumerable() 
    on cassc.CsrId equals csrr.CustomerServiceRepresentativeId 
    into temp 
from tempItem in temp.DefaultIfEmpty() 
+0

它看起来不错,但需要能够拉这个领域。 csrName = csrr.CustomerServiceRepresentativeName,现在给我一个错误 – user2320476

+0

@ user2320476我在原始问题中没有看到引用这个字段 - 很难在不看到整个图片的情况下将我的答案修改为特定的代码;然而,左外连接应该工作,并且你应该能够适应你的情况。 – CoolBots

+0

谢谢CoolBots。我添加了代码的最后一部分,并且所有正在获取的对象都未设置为对象的实例。 – user2320476