Linq Query с несколькими левыми соединениями - PullRequest
0 голосов
/ 06 апреля 2011

Я очень новичок в Linq, но мне нужно преобразовать несколько сложных SQL-запросов в Linq, поэтому я купил копию Linqer. К сожалению, я знаю, что запрос SQL Linqer не может преобразовать в Linq, потому что Linqer не может преобразовать SQL с помощью вложенных соединений. Я надеюсь, что кто-то может помочь мне с кодом Linq для этого запроса SQL:

SELECT v.*, rci.CustomId, ci.EntryTime As CheckInTime, ci.Operator As CheckInOperator, 
    cis.Name As CheckInStation, co.EntryTime As CheckOutTime, co.Operator As CheckOutOperator, 
    cos.Name As CheckOutStation, cat.Name As Category, clr.Name As Clearance, r.ReasonForVisit As Reason, 
    s.SiteId + ' -- ' + s.SiteName As Site, e.LastName + ', ' + e.FirstName As Employee 
    FROM ((((((((((Visitor v LEFT JOIN VisitorEntry ci ON v.CheckInId = ci.Id) 
    LEFT JOIN VisitorEntry co ON v.CheckOutId = co.Id) 
    LEFT JOIN Station cis ON ci.StationId = cis.Id) 
    LEFT JOIN Station cos ON co.StationId = cos.Id) 
    LEFT JOIN Category cat ON v.CategoryId = cat.Id) 
    LEFT JOIN Clearance clr ON v.ClearanceId = clr.Id) 
    LEFT JOIN Reason r ON v.ReasonId = r.Id) 
    LEFT JOIN Site s ON v.SiteId = s.Id) 
    LEFT JOIN Employee e ON v.EmployeeId = e.Id) 
    LEFT JOIN RecordCustomId rci ON v.Id = rci.ParentId) 
    WHERE 1=1 

(У меня есть несколько SQL-запросов, похожих на этот, которые мне нужно преобразовать в Linq, поэтому в запросе есть местозаполнитель WHERE.)

Также я просматривал этот пост в блоге, но все еще не могу понять, как перевести мой запрос: http://codingsense.wordpress.com/2009/06/16/multiple-list-left-join-in-linq/

Спасибо! Mike

1 Ответ

2 голосов
/ 06 апреля 2011

Какой смысл всех этих скобок в вашем SQL, они, похоже, ничего не делают, разве вы не получите точно такой же результат, если они будут удалены? Вы используете метод DefaultIfEmpty для выполнения левых соединений в linq. Я полагаю, вы используете LinqToSql? Ниже в примере из недавнего проекта, над которым я работал

return from app in pi_GetApplications()
       from names in app.tContact.tNames // Inner Join
       from addr in app.tContact.tAddresses.DefaultIfEmpty() // Left Outer Join
       select app;

Это предполагает, что у вас есть связи для внешних ключей, определенных в вашем файле DBML, чтобы LinqtoSql знал, как связаны сущности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...