如何编写返回列表的linq查询(针对不同的表)

时间:2014-07-30 13:28:38

标签: c# asp.net sql linq

我需要什么

登录用户需要一个链接到用户链接/注册的项目的所有错误的列表。

我尝试了什么

我从表示层工作三层(演示文稿 - BLL - DALL)我可以发送pk_user_id。我尝试编写一个Linq查询,返回所有错误的列表。我迷失了如何返回该列表。

我对Linq查询很新,所以我猜这是我的问题。 (我知道我需要在最后返回我的清单,但如果我达到那一点,我会很高兴。

我拥有的所有信息

我有一个包含九个表的数据库,但只有四个表示我的问题 [Bugs],[Users],[UsersOnProjects],[Projects]。

我的关系

[Users].pk_users_id         ->  [UsersOnsProjects].fk_users   
[Users].pk_users_id         ->  [Bugs].fk_creatorOfTheBug
[Users].pk_users_id         ->  [Bugs].fk_ResponsibleOfTheBug

[Projects].pk_projects_id   ->  [UsersOnProjects].fk_projects
[Projects].pk_projects_id   ->  [Bugs].fk_project

其他信息

我“认为”我不能对表[用户]与[错误]的关系做任何事情,因为它不是我需要的责任人或创造者。登录的用户需要查看链接到他注册的项目的每个Bug。

用户使用表[UsersOnPojects]链接到项目。 错误与项目相关联。

**我的代码 - 1(她收到错误,我无法将查询转换为列表)**

  public List<Bug> getAllOnProject(int p_user)
        { 

            var query4 = from t in dc.Bugs
                         join s in dc.Projects
                         on t.fk_project equals s.pk_project_id
                         join u in dc.Users
                         on s.pk_project_id equals u.fk_project
                         join v in dc.Users
                         on u.fk_user equals v.pk_User_id
                         where v.pk_User_id == p_user
                         select new
                         {
                             t.fk_bugstatus,
                             t.fk_creator,
                             t.pk_bug_id,
                             t.title,
                             t.description,
                             t.date,
                             t.fk_priority,
                             t.fk_project,
                             t.fk_responsible,
                             t.openclosed
                         };
    }

我的代码尝试nr 2(这里我有一个包含[UsersOnProjects]所有“正确”行的列表,但我不知道下一步该做什么)

 public List<Bug> getAllOnProject(int p_user)
        {
            var query1 = from t in dc.UsersOnProjects
                         where t.fk_user == p_user
                         select t;

            List<UsersOnProject> x = query1.ToList();

            foreach (var c in x)
            { 

            }
      }

谢谢!

2 个答案:

答案 0 :(得分:2)

我认为这可能会让你的第一次尝试工作 - 你只需要初始化你的Bug实体,这样就可以创建List<Bug>

public static List<Bug> getAllOnProject(int p_user)
{
    var query4 = from t in dc.Bugs
                 join s in dc.Projects on t.fk_project equals s.pk_project_id
                 join u in dc.Users on s.pk_project_id equals u.fk_project
                 join v in dc.Users on u.fk_user equals v.pk_User_id
                 where v.pk_User_id == p_user
                 select new Bug
                 {
                     fk_bugstatus = t.fk_bugstatus,
                     fk_creator = t.fk_creator,
                     pk_bug_id = t.pk_bug_id,
                     title = t.title,
                     description = t.description,
                     date = t.date,
                     fk_priority = t.fk_priority,
                     fk_project = t.fk_project,
                     fk_responsible = t.fk_responsible,
                     openclosed = t.openclosed
                 };

    return query4.ToList();
}

答案 1 :(得分:0)

我将假设存在一些导航属性:

return (from p in dc.Projects
        where p.Users.Any(u => u.fk_users == pk_user_id)
        from b in p.Bugs
        select b).ToList();

编写LINQ查询的一般建议是:使用导航属性代替这些混乱的详细联接。 EF将生成所有必需的SQL连接,同时您可以使用更简洁的语法。