LINQ多对多关系 - 获取分组对象列表

时间:2015-06-10 14:16:47

标签: c# linq group-by many-to-many left-join

我有点复杂(对我而言):

我有多个关系的2个实体。

Projects       {Project_Id, ProjectName}
Users          {User_Id, UserName} 
Projects-Users {Id, Project_Id, User_id}   

可以将项目分配给更多用户。

现在我想用Project_id,Name,ListOfAssignedUsers检索所有项目的列表(列出一次):

Id  ProjectName  Users
1   Project1     U1, U2, U3
2   Project2     
3   Project3     U1

我可以在SQL中执行此操作,但无法弄清楚如何在LINQ中执行此操作!

它的LINQ to Entity - Framework(DB first):
我的课程看起来像这样:

公共部分类项目     {         公共项目()         {             this.Users = new HashSet();         }

    public int Project_Id { get; set; }
    public string Name { get; set; }

    public virtual ICollection<Users> Users { get; set; }
}

公共部分类用户     {         公共用户()         {             this.Projects = new HashSet();         }

    public int User_Id { get; set; }
    public string UserName { get; set; }

    public virtual ICollection<Projects> Projects { get; set; }
}

(我通过删除Projects-Users中的id进行了更改,并将组合(Project_Id,User_id)作为主键。

2 个答案:

答案 0 :(得分:0)

从Project-Users表中删除Id字段。如果需要主键,则应为{Project_Id,User_id}。 Projects.Project_Id和Project-Users.Project_Id之间应该有(如果还没有)外键约束,User.User_Id和Project-Users.User_id之间应该有另一个FK

如果您在Entity Framework中映射了模型,那么您可以像这样引用它:

var result=context.Project.Include(p=>p.Users);

你可以像这样转储结果:

foreach(var record in result)
{
  Console.WriteLine("{0} {1} {2}",
    record.Project_Id,
    record.ProjectName,
    String.Join(",",record.Users.Select(u=>u.UserName)));
}

答案 1 :(得分:0)

获取具有指定用户的所有项目的列表:

var projects= from p in db.Projects select new{ project_Id = p.Project_Id, projectName = p.ProjectName, userList = p.Projects-Users.Select(pu=>pu.Users.UserName).ToList()};