2013-06-26 29 views
1

特定的兒童選擇父母我有2種類型的數據庫結構,看起來像這樣:與LINQ

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持有所有任務選定項目,並且從不過濾任務列表。

回答

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"),而不是您擁有的數據源。

+0

那麼,這工作更好,然後再:) 有沒有辦法隱藏到其他匿名類型的東西列表? 然後用其他方法編寫一個保存PtojectName和Tasks的新類,也就是說。 – yanivca

+0

@yanivca當然,只需創建除匿名類型之外的其他類型的新項目...但在此特定上下文中,您可能不需要指定類型。 – Servy

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()將其存入內存,然後您可以根據屬性groupby。