【问题标题】:Convert advanced SQL query with nested joins to Linq-to-sql将具有嵌套连接的高级 SQL 查询转换为 Linq-to-sql
【发布时间】:2012-02-12 03:40:04
【问题描述】:

我的 Linq-to-Sql 遇到了障碍。

我有一个按我想要的方式运行的 sql 查询,通常我使用 Linqer 转换为 Linq 以查看总体思路。但是这次我的 SQL 查询似乎对 Linqer 进行了改进。 :/

我认为问题在于嵌套在 LEFT OUTER JOIN 中的 INNER JOINS。不幸的是,我以前从未遇到过这个问题,也不知道如何使用 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

【问题讨论】:

  • 我认为这些连接是“链式的”而不是“嵌套的”。
  • 你看过使用 LinqPad 吗,它可能真的很有用

标签: sql linq sql-server-2008 linq-to-sql .net-4.0


【解决方案1】:

我可以看到左外连接不是问题。你只需要分割语句

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 是数据上下文。以下是解决方案的建议:

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

【讨论】:

  • 很抱歉,我花了这么长时间才回到这里。该项目已经休息了很长时间,但现在又重新启动了。
猜你喜欢
  • 2017-10-06
  • 2020-08-28
  • 1970-01-01
  • 2016-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多