如何使用Linq从一系列中的3个表中进行选择?

时间:2013-01-31 00:46:36

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

我有3张桌子:

Degree(Id int(PK),DegreeName string)

1   Bachelor
2   Master
3   PhD

跟踪(Id int(PK),DegreeId int(FK),TrackName字符串)

1   2   Engineer
2   1   Technician
3   1   Assistant
4   2   Physicist
5   3   Doctor

组(Id int(PK),TrackId int(FK),GroupName string)

1   4   Group1
2   3   Group2
3   1   Group3
4   3   Group4
5   2   Group5

在Degree和Track之间存在一对多的关系,Track和Group之间存在一对多的关系。

我有这堂课:

Public class DegreeDetails
{
    public List<Track> TrackList { get; set; }
    public List<Group> GroupsList { get; set; }
}

要获得这些属于学士学位的所有曲目,这是技术员和助手,我使用此代码:

在控制器中我使用此代码:

DegreeDetails MyView = new DegreeDetails();
MyView.TrackList = entity.Track.Where(s => s.DegreeID == 1).ToList();

如何获得所有小组的组列表这些学习课程属于学士学位,应该是Group2,Group4和Group5。

2 个答案:

答案 0 :(得分:3)

最好的办法是加入这些表格。您可以在数据库中创建视图,也可以使用Linq连接表。

这应该有效:

MyView.GroupList = (from d in entity.Degree
                    join t in entity.Track on d.Id equals t.DegreeId
                    join g in entity.Group on t.Id equals g.TrackId
                    where d.Id == 1
                    select g).Distinct().ToList();

更新如果您想使用lambda exp,请尝试:

MyView.GroupList = entity.Degree.Where(d => d.Id == 1)
                    .Join(entity.Track, d => d.Id, t=> t.DegreeId, (d, t) => t)
                    .Join(entity.Group, t => t.Id, g => g.TrackId, (t, g) => g)
                    .Distinct().ToList();

答案 1 :(得分:1)

您应该将曲目加入群组:

var groupList = entity.Track.Where(s=>s.DegreeID == 1).Join(entity.Group, t=>t.Id, g=>g.TrackId, (t,g)=>g).ToArray();