在LINQ中选择具有特定子项的父项

时间:2013-06-26 18:45:25

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

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

Project
     ProjectID
     ProjectName

Task
     TaskID
     TaskTitle
     Status
     ProjectID

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

myProject.Tasks

到目前为止一切顺利。

我想显示所有项目及其任务,因此用户可以按状态过滤它们。 这意味着我只想显示符合所选标准的那些任务(以及他们的项目)。

为此我有一个Repeater,看起来有点像这样:

<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按住 all < / em>所选项目的任务,而不是过滤的任务列表。

2 个答案:

答案 0 :(得分:2)

您不仅需要过滤可查询的项目本身,还需要将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")而不是您拥有的数据源。

答案 1 :(得分:0)

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()将其带入内存,然后您可以根据属性进行分组。