Агрегатные функции с левым внешним объединением в LINQ to Entities - PullRequest
1 голос
/ 12 февраля 2010

Я просматривал связанные вопросы 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;

1 Ответ

2 голосов
/ 12 февраля 2010

Я не понимаю, почему у вас individuals в вашем запросе, или почему вы group by offers.JobID, когда он (в отличие от jobs.JobId) может быть нулевым, но вот первый удар:

var q = from c in Context.Companies     
        from i in c.Individuals
        from j in i.Jobs
        where j.Hidden == 0
        select new 
        {
            CompanyName = c.CompanyName,
            Position = j.Position,
            Offered = j.Offers.Count(),
            Openings = j.Openings,
            Filled = j.Filled
        };

Редко правильно использовать join в LINQ to Entities или LINQ to SQL .

...