1

次のような2つのタイプのデータベース構造があります。

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保持し、フィルター処理されたタスクを保持することはありません。リスト。

4

2 に答える 2

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")ものではなく変更する必要があることに注意してください。

于 2013-06-26T18:58:38.637 に答える
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() を使用してこれをメモリに取り込み、プロパティに基づいてグループ化できます。

于 2013-07-16T09:51:25.057 に答える