2010-02-12 97 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