LINQ加入/分组问题

时间:2013-12-21 18:18:05

标签: c# sql asp.net-mvc linq entity-framework

所以我再次陷入困境......

我正在尝试加入三个表并与linq组合;公司,通知和要求。

  • 公司可以发出许多通知。

  • 通知具有SubcategoryId和CompanyId

  • 请求具有SubcategoryId。

我的目标是获取公司列表,并为每个公司获取他们注意到的子类别的列表,并为每个注意到的子类别列出该子类别中的请求

实施例 公司x正在监控子类别4和7。 告诉他我们在这些子代码中有什么要求。

这就是我只为一家公司做的事情。但是当我需要一个包含多家公司的列表时,我无法解决分组和加入问题。

Company company = db.Companies.Where(x=>x.UserId == 10).FirstOrDefault();
            var requestByNotices =
            from notice in company.Notices
            join request in db.Requests.Where(z => z.IsApproved &
                 z.Status.Status == "Active") on notice.SubcategoryId equals
                 request.Subcategoryid

更新

让我重新解释一下我的问题。

此查询正在生成一个包含我正在寻找的结果的表:

SELECT Companies.CompanyId, Companies.Name, Account.Email, Notices.SubcategoryId, Requests.FriendlyName FROM Companies
INNER JOIN Notices  ON Companies.CompanyId = Notices.CompanyId 
INNER JOIN Account  ON Account.UserId = Companies.Uid
INNER JOIN Requests ON Notices.SubcategoryId = Requests.Subcategoryid 
WHERE Requests.StartDate > '2013-12-22';  

但是我不想生成一个平面列表,而是将其转换为linq,但也将其转换为CompanyId。因此,每家公司仅由一行代表,在该公司内我可以获得请求。

所以不是这样的列表:

CompanyId   Name   Email            SubcategoryId     FriendlyName
1           Test   test@test.com    2                 x
1           Test   test@test.com    4                 y

我想这样:

CompanyId   Name   Email            GroupOfRequests  
1           Test   test@test.com    contains two 

感谢任何帮助!

1 个答案:

答案 0 :(得分:1)

更新:如果我理解你想要这样的东西

var result =
        from company in db.Companies
        from notice in company.Notices
        join request in db.Requests.Where(z => z.IsApproved &&
             z.Status.Status == "Active") on notice.SubcategoryId equals request.Subcategoryid
        group new {notice, request } by company into gr           
        select new {gr.Key, Value = gr.ToList() }

<强> UPDATE2
你的SQL似乎是这样的

from company in db.Companies
join notice in db.Notices on company.CompanyId equals notice.CompanyId
join account in db.Account on company.Uid equals account.UserId
join request in db.Requests on notice.SubcategoryId equals request.SubcategoryId

group new {notice, request} by new {company, account} into g
select new {g.Key, value = g}