2013-10-03 179 views
0

我想要使用linq-to-sql查詢,它將使用內連接和左外連接(使用.DefaultIfEmpty()),但查詢不起作用。這在我T-SQL中是一個簡單的任務。 這裏是我的查詢:Linq-To-SQL的左外連接

var results = from cy in _dc.Companies 
         join cyv in _dc.CompanyVersions 
          on cy.CompanyId equals cyv.CompanyId 
         join cyd in _dc.CompanyDetails 
          on cyv.CompanyVersionId equals cyd.Id 
         join cd in _dc.CustomerDetails 
          on cy.CompanyId equals cd.CompanyId 
         join d in _dc.Documents 
          on cd.CustomerId equals d.CustomerId 
         join di in _dc.DocumentItems 
          on d.DocumentId equals di.DocumentId 
         join dd in _dc.DocumentDetails 
          on di.DocDetailsId equals dd.DocumentDetailsId 
         join dt in _dc.DetailTypes 
          on dd.detailTypeId equals dt.detailTypeId 
         join vt in _dc.Vats 
          on dt.VATCode equals vt.VATCode 
         join v in _dc.Vouchers.DefaultIfEmpty() 
          on dd.DocumentDetailsId equals v.DocDetailID 
         join cc in _dc.CreditCards.DefaultIfEmpty() 
          on v.CCType equals cc.CCType 
         where 
          (d.DocTypeId == 1 || d.DocTypeId == 2) && (d.DocDate >= date)  
         && 
          (d.DocDate < date.AddDays(1)) && 
          (d.CompanyVersionId == cyv.CompanyVersionId) 
          && (d.isDeleted == false || d.isDeleted == null) 
         orderby d.DocNumber ascending 
         select new 
           { 
            d.DocumentId, 
            d.DocNumber, 
            d.AutUser, 
            d.GrossAmount, 
            d.DocTypeId, 
            cyd.Name, 
            cyd.AddressLine1, 
            cyd.AddressLine2, 
            cyd.TelephoneLine, 
            cyd.FaxLine, 
            v.FromVoucNbr, 
            d.DocDate, 
            cd.CustomerName, 
            cd.StreetAddress, 
            cd.City, 
            cd.Country, 
            dt.DetDescr, 
            cc.CCType, 
            dd.FreeDescr, 
            dd.NetAmount, 
            dd.VATAmount, 
            vt.VATDescr, 
            cc.Description, 
            vt.VATRate 
           }; 

任何人都可以建議如何,我可以使用左外連接在此查詢的最後2個表?

+0

當您使用導航屬性時,這非常容易。 –

回答

1

你把兩個.DefaultIfEmpty都放錯了。 我認爲這是這樣的(雖然我不確定where子句..)。

var results = 
from cy in _dc.Companies 
    join cyv in _dc.CompanyVersions on cy.CompanyId equals cyv.CompanyId 
    join cyd in _dc.CompanyDetails on cyv.CompanyVersionId equals cyd.Id 
    join cd in _dc.CustomerDetails on cy.CompanyId equals cd.CompanyId 
    join d in _dc.Documents on cd.CustomerId equals d.CustomerId 
    join di in _dc.DocumentItems on d.DocumentId equals di.DocumentId 
    join dd in _dc.DocumentDetails on di.DocDetailsId equals dd.DocumentDetailsId 
    join dt in _dc.DetailTypes on dd.detailTypeId equals dt.detailTypeId 
    join vt in _dc.Vats on dt.VATCode equals vt.VATCode 
    join v in _dc.Vouchers on dd.DocumentDetailsId equals v.DocDetailID into other1 
    from o1 in other1.DefaultIfEmpty() 
    join cc in _dc.CreditCards on v.CCType equals cc.CCType into other2 
    from o2 in other2.DefautlIfEmtpy() 
    where (d.DocTypeId == 1 || d.DocTypeId == 2) 
         && (d.DocDate >= date)  
         && (d.DocDate < date.AddDays(1)) 
         && (d.CompanyVersionId == cyv.CompanyVersionId) 
         && (d.isDeleted == false || d.isDeleted == null) 
    orderby d.DocNumber ascending 
    select new 
      { 
       d.DocumentId, 
       d.DocNumber, 
       d.AutUser, 
       d.GrossAmount, 
       d.DocTypeId, 
       cyd.Name, 
       cyd.AddressLine1, 
       cyd.AddressLine2, 
       cyd.TelephoneLine, 
       cyd.FaxLine, 
       o1.FromVoucNbr, 
       d.DocDate, 
       cd.CustomerName, 
       cd.StreetAddress, 
       cd.City, 
       cd.Country, 
       dt.DetDescr, 
       o2.CCType, 
       dd.FreeDescr, 
       dd.NetAmount, 
       dd.VATAmount, 
       vt.VATDescr, 
       o2.Description, 
       vt.VATRate 
      }; 
+0

而不是使用像'other1'這樣的變量名,你可以使用例如'從_db.vouchers中的v ...到v中的v1到v1.DefaultIfEmpty()' –

+0

nope我甚至不能在查詢時編譯我嘗試你的方法... – DeadlyDan

+0

VS給了什麼錯誤? – Loetn

0

是的加入順序是不正確的,我已經解決,現在這裏是工作和編譯的查詢:

附:感謝大家的幫助!

var results = 
      from cy in _dc.Companies 
      join cyv in _dc.CompanyVersions on cy.CompanyId equals cyv.CompanyId 
      join cyd in _dc.CompanyDetails on cyv.CompanyVersionId equals cyd.Id 
      join cd in _dc.CustomerDetails on cy.CompanyId equals cd.CompanyId 
      join d in _dc.Documents on cd.CustomerId equals d.CustomerId 
      join di in _dc.DocumentItems on d.DocumentId equals di.DocumentId 
      join dd in _dc.DocumentDetails on di.DocDetailsId equals  
      dd.DocumentDetailsId 
      join dt in _dc.DetailTypes on dd.detailTypeId equals dt.detailTypeId 
      join vt in _dc.Vats on dt.VATCode equals vt.VATCode 
      join v in _dc.Vouchers on dd.DocumentDetailsId equals v.DocDetailID into 
      other1 
      from o1 in other1.DefaultIfEmpty() 
      join cc in _dc.CreditCards on o1.CCType equals cc.CCType into other2 
      from o2 in other2.DefaultIfEmpty() 
      where (d.DocTypeId == 1 || d.DocTypeId == 2) 
        && (d.DocDate >= date) 
        && (d.DocDate < date.AddDays(1)) 
        && (d.CompanyVersionId == cyv.CompanyVersionId) 
        && (d.isDeleted == false || d.isDeleted == null) 
      orderby d.DocNumber ascending 
      select new 
         { 
          d.DocumentId, 
          d.DocNumber, 
          d.AutUser, 
          d.GrossAmount, 
          d.DocTypeId, 
          cyd.Name, 
          cyd.AddressLine1, 
          cyd.AddressLine2, 
          cyd.TelephoneLine, 
          cyd.FaxLine, 
          o1.FromVoucNbr, 
          d.DocDate, 
          cd.CustomerName, 
          cd.StreetAddress, 
          cd.City, 
          cd.Country, 
          dt.DetDescr, 
          o2.CCType, 
          dd.FreeDescr, 
          dd.NetAmount, 
          dd.VATAmount, 
          vt.VATDescr, 
          o2.Description, 
          vt.VATRate 
         };