2012-01-16 3 views
0

Я борюсь с тем, как написать эквивалент ниже, как LINQ. По-моему, я только боюсь, как я представляю часть INNER JOIN(). Это называется вложенным соединением? Анонимная регистрация? Я даже не уверен. В любом случае, большое спасибо всем, кто может указать мне правду. Даже если это именно то, что называется так, я могу правильно его использовать.Преобразование SQL в LINQ с INNER JOIN()?

SELECT p.PersonID, p.FirstName, p.MiddleName, p.LastName, cp.EnrollmentID, cp.EnrollmentDate, cp.DisenrollmentDate 
FROM vwPersonInfo AS p 
    INNER JOIN (
    SELECT c.ClientID, c.EnrollmentID, c.EnrollmentDate, c.DisenrollmentDate 
    FROM tblCMOEnrollment AS c 
     LEFT OUTER JOIN tblWorkerHistory AS wh 
     ON c.EnrollmentID = wh.EnrollmentID 
      INNER JOIN tblStaffExtended AS se 
      ON wh.Worker = se.StaffID 
    WHERE (wh.EndDate IS NULL OR wh.EndDate >= getdate()) 
    AND wh.Worker = --WorkerID Param Here 
) AS cp 
ON p.PersonID = cp.ClientID 
ORDER BY p.PersonID 
+1

Это выглядит полезным: http://weblogs.asp.net/rajbk/archive/2010/03/12/joins-in-linq-to-sql .aspx – David

+0

@David: выглядит как хороший сайт, хотя я не вижу примеров того, что я прошу, если мое невежество не заставляет меня не понимать, что что-то есть то, что я прошу .... :) –

ответ

4

просто положить внутренний запроса в своей переменной. (Он будет переведен в один выражение SQL)

var innerQuery = from x in db.tblCMOEnrollment 
       where ... 
       select ...; 

var query = from a in vwPersonInfo 
      join b innerQuery on p.PersonID equals cp.ClientID 
      select ...; 
+0

Это сработало , благодаря! –

0

Я думаю, что вы можете сделать это, написав второй способ и соединение по этому методу:

private static IEnumerable<Table> GetData(int joinKey) 
    { 
     return (from x in context.TableB.Where(id => id.Key == joinKey select x).AsQueryable(); 
    } 

Тогда вы можете сделать свой обычный запрос:

var query = from c in context.TableA 
join GetData(c.PrimaryKeyValue)