在LINQ中选择具有特定子项的家长
本文关键字:LINQ 选择 | 更新日期: 2023-09-27 18:20:11
我有一个有两种类型的数据库结构,看起来像这样:
Project
ProjectID
ProjectName
Task
TaskID
TaskTitle
Status
ProjectID
由于sql服务器上声明的所有关系,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
保持时,所选项目的所有任务,而从不显示筛选任务列表。
您不仅需要过滤可查询的项目本身,还需要将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")
,而不是现有的数据源。
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()将其存储到内存中,然后可以根据属性进行分组。