2010-02-12 96 views
1

我一直在尋找相關的LINQ問題,試圖找出這一問題,但我在將我的SQL查詢轉換爲等效的LINQ to Entities時遇到了一些麻煩版。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中加入similar to this example之前,但我不知道如何將countgroup聲明與此相結合,得到期望的結果:

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-fu仍然很弱。

更新:

這是我來到克雷格的幫助下解決方案,不得不使用LINQ,因爲不幸的多重背景下建立的對象,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; 

回答

2

我不明白你爲什麼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 
     }; 

It's rarely correct to use join in LINQ to Entities or LINQ to SQL

+0

謝謝你刺傷它,克雷格,看起來很有希望;並提供鏈接到您的文章。 爲了解決您的第一條評論,數據庫的設計使得將工作與公司綁定的唯一方式是通過發佈該工作的個人(個人數據有時也會在應用中的特定情況下顯示)。至於小組,你對錯誤的報價絕對正確.JobID – 2010-02-12 20:54:04

+0

哦,好的;然後,我將更新個人的查詢。 – 2010-02-12 21:29:12

+0

如果我有一個(非理想)情況,即個人處於不同的數據上下文中,是否還有一種方法可以在不使用連接的情況下執行此操作? – 2010-02-18 16:23:18