【问题标题】:Need help on LINQ query left joins and multiple fields需要有关 LINQ 查询左连接和多个字段的帮助
【发布时间】:2010-11-12 07:10:44
【问题描述】:

我想将以下 SQL 查询重写为 LINQ:

SELECT gp.Name
 , r.DateOfRace
 , ISNULL(SUM(rr.Points), 0) AS Points
FROM Races r
INNER JOIN GrandPrix gp
 ON r.GrandPrixId = gp.GrandPrixId
LEFT JOIN Predictions p
 ON p.RaceId = r.RaceId
 AND p.AdditionalUserInformationId = 2
LEFT JOIN RaceResults rr
 ON p.DriverId = rr.DriverId
 AND p.FinishPosition = rr.FinishPosition
 AND p.RaceId = rr.RaceId
WHERE r.Season = 2010
GROUP BY gp.Name
 , p.RaceId
 , r.DateOfRace

这就是我得到的很多,当它仍在工作时:

from races in Races
join grandprix in GrandPrixes
on races.GrandPrixId equals grandprix.GrandPrixId
from Predictions in Predictions.Where(v => v.RaceId == races.RaceId).DefaultIfEmpty()
select new
{
 DateOfRace = races.DateOfRace,
 GrandPrix = grandprix.Name,
}

当我走得更远时,事情就会出错 - 例如,我无法正确获取AND p.AdditionalUserInformationId = 2

希望有人能帮忙!

【问题讨论】:

    标签: c# sql linq linq-to-sql c#-4.0


    【解决方案1】:

    您可以执行以下操作:

    join p in Predictions
        on new { p.RaceId, p.AdditionalUserInformationId } =
           new { r.RaceId, AdditionalUserInformationId = 2 } into ps
    from p in ps.DefaultIfEmpty()
    join rr in RaceResults
        on new { p.DriverId, p.RaceId, p.FinishPosition } =
           new { rr.DriverId, rr.RaceId, rr.FinishPosition } into rrs
    from rr in rrs.DefaultIfEmpty()
    

    您使用 C# 的能力在结构上比较匿名类型。使用相同的属性创建了两个匿名类型,这使它们成为同一类的实例。然后可以比较这些实例。

    【讨论】:

    • 谢谢(Dank je wel :-))罗纳德,这对我帮助很大。最后一件事——这些连接产生内部连接而不是左连接。我在帖子中提出的语法使用 .Where() 方法,它实际上就是这样做的。有了这个版本,这不再适用,所以......有一个简单的解决方案吗?
    • Graag gedaan :) 我更新了我的答案,以便它使用两个左外连接。
    • 达的幻想! (太棒了!)你在这里做了一个快乐的人罗纳德!
    • 不客气 :) 如果这回答了您的问题,您能否将其标记为已回答?
    【解决方案2】:
    join grandprix in GrandPrixes
    on new {races.GrandPrixId, p.AdditionalUserInformationId} equals new {grandprix.GrandPrixId,2}
    

    【讨论】:

    • 这不会编译。您必须为匿名类型中的每个属性命名。
    猜你喜欢
    • 1970-01-01
    • 2011-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-29
    • 2023-03-20
    • 1970-01-01
    • 2011-08-06
    相关资源
    最近更新 更多