OUTER APPLY in Sql Server is a very convenient joining technique to achieve Left outer join with a group by. See the below example.
Example:
select Name, ea.eeacount, es.name
From dbo.EnrollmentEntity ee
OUTER APPLY
(
Select count(eea.Id) as eeacount
From dbo.EnrollmentEntityAssister eea
Where eea.EnrollmentEntityId = ee.Id and eea.active =1 and ee.active = 1
)ea
OUTER APPLY
(
Select TOP 1 ls.name
From dbo.EnrollmentEntityStatus ees
join dbo.LookupEnrollmentEntityStatus ls on ees.StatusId = ls.Id and ls.active = 1
where ees.EnrollmentEntityId = ee.Id and ees.active = 1 and ee.active = 1
Order by ees.UpdatedDate desc
)es
This query gets all the EnrollmentEntity records with a count of the assisters for each Enrollment Entity and the latest status
To achieve similar in Linq, we can do something like this:
var results = from enrollmentEntity in enrollmentEntities join assister in assisters on enrollmentEntity.Id equals assister.EnrollmentEntityId into eAssisters join status in statuses on enrollmentEntity.Id equals status.EnrollmentEntityId into eStatuses where enrollmentEntity.Active select new EnrollmentEntityGridViewModel { Id = enrollmentEntity.Id, Name = enrollmentEntity.Name, Assisters = eAssisters.Count(), RenewalDate = "", Status = eStatuses.OrderByDescending(p => p.UpdatedDate).FirstOrDefault().StatusIdSource.Name };
Neat, huh!
2 comments:
is it left outer join in the example?
Nope. It is outer apply - a new feature since sql server 2005. Its different from outer join.
Post a Comment