扩展方法语法为多对多关系

时间:2013-01-28 05:00:52

标签: c# linq entity-framework linq-to-entities inner-join

来自新手的Linq方法语法,所以我很欣赏任何人都可以传递的见解。我需要的东西看起来很简单,但它让我围成一圈。我有2个表和一个关联(基本上只有2个字段的联结表)。我在SO上经历了很多帖子,但我只是没有得到它。令人沮丧。好的,使用EF4,我在Reports上有Reports和Roles以及一个名为Roles的导航属性,它是联结表(带有ReportId和RoleId字段,都是整数字段)。我使用UserId从Roles表中获取所有相关角色,使用这些角色从联结表中获取相关报告,然后从Reports中获取报告的名称。

我已经尝试过LinqPad,但是当我将它粘贴回LinqPad时,它在lambda方法语法中生成的内容甚至不起作用。

SQL查询:

select Reports.ReportName 
 from Reports 
 inner join UserRoles on Reports.ReportId = UserRoles.ReportId 
 inner join Roles on Roles.RoleId = UserRoles.RoleId 
 where UserRoles.UserId == userId
到目前为止

代码:

Reports.Select(a => a.Roles.Where(t => t.UserRoles.Select(u => u.UserId == userId)));

2 个答案:

答案 0 :(得分:0)

您可以尝试一下,您可能还想根据您的需要过滤您的选择:

var result = from allReports in Reports
             join userRoles in userRoles on allReports.ReportId equals userRoles.ReportId
             join roles in Roles on userRoles.RoleId equals roles.RoleId
             where userRoles.UserId == userid
             select allReports; 

答案 1 :(得分:0)

在这种情况下,我认为这种查询语法要好得多:

var query = from report in db.Reports
            join ur in db.UserRoles on report.ReportId equals ur.ReportId
            join role in db.Roles on ur.RoleId equals role.RoleId
            where ur.UserId == userId
            select report.ReportName;