Нужна помощь по LINQ-запросу левых соединений и нескольких полей - PullRequest
1 голос
/ 12 ноября 2010

У меня есть следующий запрос 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.

Надеюсь, кто-нибудь может помочь!

Ответы [ 2 ]

3 голосов
/ 12 ноября 2010

Вы можете сделать следующее:

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 # для структурного сравнения анонимных типов. Два анонимных типа создаются с одинаковыми свойствами, что делает их экземплярами одного и того же класса. Затем эти экземпляры можно сравнить.

1 голос
/ 12 ноября 2010
join grandprix in GrandPrixes
on new {races.GrandPrixId, p.AdditionalUserInformationId} equals new {grandprix.GrandPrixId,2}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...