将具有嵌套联接的高级SQL查询转换为Linq到SQL

将具有嵌套联接的高级SQL查询转换为Linq到SQL,sql,linq,sql-server-2008,linq-to-sql,.net-4.0,Sql,Linq,Sql Server 2008,Linq To Sql,.net 4.0,我的Linq to Sql遇到了一个障碍 我有一个按我想要的方式运行的sql查询,通常我使用Linqer转换为Linq以了解总体思路。但这一次,我的SQL查询对于Linqer来说似乎更高级了/ 我认为问题在于嵌套在左侧外部联接中的内部联接。不幸的是,我以前从未遇到过这个问题,不知道如何使用Linq解决它 我的SQL查询如下所示: SELECT c.[Company], c.[Name_First], c.[Name_Last], ort.[IDOriginatorRoleType],

我的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

我所看到的左侧外部连接不是问题。你只需要把陈述分开

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
        }
    );

我认为这些连接是“链式的”而不是“嵌套的”。你看了使用Link QPAD,它可能真的有用吗?很抱歉我花了这么长的时间才回到这里。这个项目已经搁置了很长时间,但现在又重新启动了。