Я просматривал связанные вопросы LINQ здесь, пытаясь выяснить это, но у меня возникли некоторые проблемы при преобразовании моего запроса SQL в эквивалентную версию LINQ to Entities.
select companies.CommpanyName,
job.Position,
count(offers.jobID) As Offered,
job.Openings,
job.Filled
from jobs
left outer join offers on jobs.ID = offers.JobID
join membership.dbo.individuals on jobs.UserID = individuals.ID
join membership.dbo.companies on individuals.CompanyID = companies.ID
where jobs.Hidden = 0
group by offers.JobID,
companies.CommpanyName,
job.Position,
job.Openings,
job.Filled
Я делал левые внешние объединения в LINQ до , как в этом примере , но я не уверен, как объединить операторы count
и group
с этим, чтобы получить желаемый результат:
CompanyName Position Offered Openings Filled
1 Exmaple Co. Job X 0 2 0
2 Example Co. Job Y 4 6 3
3 Test Co. Job Z 1 1 1
Запрос дополнительно усложняется тем, что ему необходимо использовать два отдельных контекста данных. Я прошу прощения за отсутствие примера кода, но я действительно не уверен, как начать это, мой LINQ-фу все еще слаб.
Обновление:
Это решение, к которому я пришел с помощью Крейга, вынуждено было использовать LINQ to Objects из-за неудачной множественной настройки контекста, JobWithOfferCounts не является объектом-сущностью:
IEnumerable<Job> t = context1.JobSet.Include("Offers").Include("Contacts").Where(j => j.Hidden == false);
IEnumerable <JobWithOfferCounts> r = (from j in t
join i in context2.IndividualSet on j.UserID equals i.ID
join c in context2.CompanySet on i.CompanyID equals c.ID
select new JobWithOfferCounts()
{
JobObject = j,
CompanyID = Convert.ToInt32(c.ID),
CompanyName = c.HostName,
OfferCount = j.offers.Count(o => o.Rejected == false),
FilledCount = j.offers.Count(o => o.Accepted == true),
PendingCount = j.offers.Count(o => o.Accepted == false && o.Rejected == false)
});
return r;