2012-01-17 79 views
3

我已經遇到了與我的Linq-to-sql有關的問題。將嵌套連接的高級SQL查詢轉換爲Linq-to-sql

我有一個SQL查詢,運行我想要的方式,通常我使用Linqer轉換爲Linq來查看一般想法。但是這次我的SQL查詢似乎爲Linqer提前了。 :/

我認爲問題是嵌套在左外聯接中的內聯接。不幸的是,我從來沒有遇到過這種情況,也不知道如何使用Linq來解決這個問題。

我的SQL查詢看起來是這樣的:

SELECT c.[Company], c.[Name_First], c.[Name_Last], ort.[IDOriginatorRoleType], 
     ort.[RoleType] AS [OriginatorRoleType], o.[IDOriginator], o.[IDWork], 
     o.[IDContact], m.[IDMedia], m.[IDWork], m.[FileName], m.[FileNameOnDisk], 
     m.[DateAdded], w.[IDWork] AS [IDWork2], w.[ArticleNumber], w.[Title], 
     w.[FrontPageLow], w.[FrontPageLowOnDisk], w.[FrontPageHigh], 
     w.[FrontPageHighOnDisk] 
FROM [dbo].[tblSubscriptionsWorks] AS sw 
INNER JOIN [dbo].[tblWorks] AS w ON sw.[IDWork] = w.[IDWork] 
LEFT OUTER JOIN [dbo].[tblMedias] AS m ON m.[IDWork] = w.[IDWork] 
LEFT OUTER JOIN ([dbo].[tblOriginators] AS o 
    INNER JOIN [dbo].[tblOriginatorRoles] AS ors ON 
      o.[IDOriginatorRole] = ors.[IDOriginatorRole] 
    INNER JOIN [dbo].[tblOriginatorRoleTypes] AS ort ON 
      ors.[IDOriginatorRoleType] = ort.[IDOriginatorRoleType] 
    INNER JOIN [dbo].[tblContacts] AS c ON 
      o.[IDContact] = c.[IDContact]) ON 
(o.[IDWork] = w.[IDWork]) AND (ort.[IDOriginatorRoleType] = 1) 
WHERE sw.[IDWork_Subscription] = 9942 
+0

我會認爲這些連接是'鏈接'而不是'嵌套'。 – onedaywhen 2012-01-17 10:24:50

+0

你有沒有看過使用LinqPad,它可能是非常有用的 – Kane 2012-01-17 10:26:18

回答

2

左外連接是不是有什麼我可以看到一個問題。您只需將語句

LEFT OUTER JOIN ([dbo].[tblOriginators] AS o 
    INNER JOIN [dbo].[tblOriginatorRoles] AS ors ON 
      o.[IDOriginatorRole] = ors.[IDOriginatorRole] 
    INNER JOIN [dbo].[tblOriginatorRoleTypes] AS ort ON 
      ors.[IDOriginatorRoleType] = ort.[IDOriginatorRoleType] 
    INNER JOIN [dbo].[tblContacts] AS c ON 
      o.[IDContact] = c.[IDContact]) ON 
(o.[IDWork] = w.[IDWork]) AND (ort.[IDOriginatorRoleType] = 1) 

分成另一個IQueryable列表。在這個例子中,變量db是datacontext。這是一個解決方案的建議:

//selects all the columns that is just in the select from the left join 
var leftJoin= 
       (
        from o in db.tblOriginators 
        join ors in db.tblOriginatorRoles 
         on o.IDOriginatorRole equals ors.IDOriginatorRole 
        join ort in db.tblOriginatorRoleTypes 
         on ors.IDOriginatorRoleType equals ort.IDOriginatorRoleType 
        join c in db.tblContacts 
         on o.IDContact equals c.IDContact 
        where ort.IDOriginatorRoleType==1 
        select new 
        { 
         o.IDWork, 
         c.Company, 
         c.Name_First, 
         c.Name_Last, 
         ort.IDOriginatorRoleType, 
         ort.RoleType, 
         o.IDOriginator, 
         o.IDContact 
        } 
       ); 
var output=(
     from sw in db.tblSubscriptionsWorks 
     join w in db.tblWorks 
      on sw.IDWork equals w.IDWork 
     from m in db.tblMedias 
      .Where(x=>x.IDWork==w.IDWork).DefaultIfEmpty() 
     //Left join with the IQueryable list 
     from org in leftJoin 
      .Where(x =>x.IDWork==w.IDWork).DefaultIfEmpty() 
     where 
      sw.IDWork_Subscription == 9942 
     select new 
     { 
      org.Company, 
      org.Name_First, 
      org.Name_Last, 
      org.IDOriginatorRoleType, 
      OriginatorRoleType=org.RoleType, 
      org.IDOriginator, 
      org.IDWork, 
      m.IDMedia, 
      m.IDWork, 
      m.FileName, 
      m.FileNameOnDisk, 
      w.FrontPageLow, 
      w.FrontPageLowOnDisk, 
      w.FrontPageHigh, 
      w.FrontPageHighOnDisk 
     } 
    ); 
+0

對不起,我花了這極其漫長的時間來回到這個。該項目已經休息了很長時間,但現在又重新開始。 – 2013-02-07 23:11:00