【问题标题】:How to write linq query (for different tables) that returns list如何编写返回列表的 linq 查询(针对不同的表)
【发布时间】:2014-07-30 13:28:37
【问题描述】:

我需要什么

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

我的尝试

我在表示层的三层(表示 - BLL - DALL)中工作,我可以发送 pk_user_id。我尝试编写一个 Linq 查询,返回所有错误的列表。我不知道如何返回该列表。

我对 Linq 查询很陌生,所以我想这是我的问题。 (我知道我需要在最后归还我的清单,但如果我能做到这一点,我会很高兴。

我拥有的所有信息

我有一个包含九个表的数据库,但只有四个代表我的问题 [错误]、[用户]、[UsersOnProjects]、[项目]。

我的关系

[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

其他信息

我“认为”我无法对表 [Users] 与 [Bugs] 的关系做任何事情,因为它不是我需要的负责人或创建者。登录的用户需要查看与他注册的项目相关联的每个 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)
            { 

            }
      }

谢谢!

【问题讨论】:

  • 在 linq 查询末尾添加 ToList()。
  • 那是怎么编译的? getAllOnProject 不返回值...
  • UsersOnProjects 是类模型的一部分,还是您在 User 和 Project 之间建立了纯粹的多对多关联? (即属性User.ProjectsProject.Users)。

标签: c# asp.net sql linq


【解决方案1】:

我认为这可能会让你的第一次尝试工作 - 你只需要初始化你的 Bug 实体,以便可以创建 List&lt;Bug&gt;

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();
}

【讨论】:

    【解决方案2】:

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

    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 连接,而您可以使用更简洁的语法。

    【讨论】:

      猜你喜欢
      • 2020-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-11
      • 2023-03-09
      • 1970-01-01
      相关资源
      最近更新 更多