【问题标题】:Convert SQL to linq to SQL with cross apply [duplicate]使用交叉应用将 SQL 转换为 linq 到 SQL [重复]
【发布时间】:2015-05-12 02:41:31
【问题描述】:

知道如何将此交叉应用 SQL 查询转换为 linq-to-sql 吗?

    select *
    from dbo.Company
    inner join dbo.Contact c on c.contID = dbo.Company.compContactID or dbo.Company.compContactID is null
    inner join dbo.Company_Program cp on cp.compID = dbo.Company.compID or dbo.Company.compID is null
    inner join dbo.Program p on cp.progID = p.progProgramID
    inner join dbo.Division d on d.divID = p.progDivisionID
    inner join dbo.PhoneType pt on pt.phtPhoneTypeID = c.contPhoneTypeID or c.contPhoneTypeID is null
    inner join dbo.PhoneNumber ph on ph.phoneID = pt.phtPhoneID or pt.phtPhoneID is null

    cross apply (select top 1*
        from dbo.Participation p
        where p.participationID = dbo.Company.compParticipationID or dbo.Company.compParticipationID is null 
    )  part 
    where divID = 29

【问题讨论】:

    标签: sql linq-to-sql


    【解决方案1】:

    CROSS APPLY 将对每个左侧行的给定查询进行评估,如果存在一个或多个,则返回公司的第一个参与,如果根本不存在公司参与,则返回表中的第一个参与。

    暂时忽略其他表,您应该能够通过应用与上述相同逻辑的投影获得与原始 Sql CROSS APPLY 相同的结果:

    var result = db.Companies
        // Include / Join on the other tables here ...
        .Select(c => new 
         {
            Company = c,
            Participation = db.Partipations
                 .FirstOrDefault(p => c.compParticipationID == p.participationID 
                                     || c.compParticipationID == null)
        })
       // Project out your final columns from Company, Participation etc.;
    

    然而,上述 Linq 会出现 1:N 性能问题(即在 Participations 中查找 Company 的每一行)。有一些性能优化,例如如果许多公司没有参与(即 null compParticipationID),您可以预先获取表中的第一个参与并将其应用到合并中:

    var defaultParticipation = db.Partipations.FirstOrDefault();
    
    // ... as above
    
        Participation = db.Partipations
             .FirstOrDefault(p => c.compParticipationID == p.participationID)
             ?? defaultParticipation;
    

    类似地,如果表中只有几个 Participations,您可以预取所有这些并通过 participationID 将它们键入字典中,如果查找失败,则再次合并到默认参与(通过 TryGetValueContainsKey)。

    【讨论】:

    • 我还必须说,原始 Sql 查询中的 select top 1 * FROM Participation 令人不安——它可能返回伪随机行,因为没有 order by 或其他谓词。实际上它可能是 Sql 中的一个错误,因为它似乎使用了与其他表连接中相同的“默认”模式?
    猜你喜欢
    • 1970-01-01
    • 2011-06-10
    • 2020-10-07
    • 2015-04-25
    • 2021-07-05
    • 2011-03-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多