【问题标题】:Select parents with specific children in LINQ在 LINQ 中选择具有特定孩子的父母
【发布时间】:2013-06-26 18:45:25
【问题描述】:

我有 2 种类型的数据库结构,如下所示:

Project
     ProjectID
     ProjectName

Task
     TaskID
     TaskTitle
     Status
     ProjectID

由于在 sql server 上声明的所有关系 - dbml 自动知道它们,我可以简单地通过以下方式获取所有项目的任务:

myProject.Tasks

到目前为止一切顺利。

我想显示所有项目及其任务,以便用户可以按状态过滤它们。 这意味着我只想显示那些满足所选标准的任务(当然还有他们的项目)。

为此,我有一个中继器,看起来有点像这样:

<asp:Repeater id="rptProjects" runat="server">
      <ItemTemplate>
          <%# Eval("ProjectName") %> (<%# Eval("ProjectID") %>):
                  <asp:Repeater id="rptTasks" DataSource="<%#(Container.DataItem as Project).Tasks %>" runat="server">                          
                      <ItemTemplate>
                          <%# Eval("TaskTitle") %>
                      </ItemTemplate>
                  </asp:Repeater>
      </ItemTemplate>
</asp:Repeater>

但我无法确定所需的 LINQ 查询。

在我尝试的每个查询中,我的项目都正常(这意味着如果项目的任务都不符合所选标准,则它不在列表中),但每次Project.Tasks 持有全部 所选项目的任务,而不是过滤的任务列表。

【问题讨论】:

    标签: c# asp.net .net linq linq-to-sql


    【解决方案1】:

    您不仅需要过滤可查询的项目本身,还需要将Tasks 关系投影到具有给定条件的新关系:

    var query = context.Projects.Where(project => 
            project.Tasks.Any(task => task.Status == someStatus)
        .Select(project => new
        {
            project.ProjectName,
            Tasks = project.Tasks.Where(task => task.Status == someStatus),
        });
    

    请注意,由于此更改,您需要将内部转发器的数据源更改为 Eval("Tasks") 而不是您拥有的。

    【讨论】:

    • 嗯,这比以往任何时候都好 :) 有没有办法隐蔽到匿名类型以外的列表?另一种方法是编写一个包含 PtojectName 和 Tasks 的新类,即。
    • @yanivca 当然,只需创建匿名类型以外的其他类型的新项目......但在这个特定的上下文中,您可能不需要命名类型。
    【解决方案2】:
    var TasksForProject = from p in Project
    join t in Tasks on p.ProjectID equals t.ProjectID
    where t.Satus !=null and t.status==SomeStatus
    select new {
    p,t
    }
    

    之后,您可以使用 tolist() 将其记入内存,然后您可以根据属性进行分组。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-11
      • 2019-06-10
      • 1970-01-01
      • 2014-12-19
      • 1970-01-01
      • 2012-10-13
      • 2011-09-12
      相关资源
      最近更新 更多