0

この方法で最高潮に達したツリーのような構造を生成することについて、以前に質問しました。

    public ICollection<DefaultEventType> GetTierTree()
    {
        var q = from mission in _context.tMissions
                join activity in _context.tActivities on mission.id equals activity.missionId
                join project in _context.tDefaultEventTypes on activity.id equals project.activityId
                where !project.isRemoved && project.defaultCategoryId == 4
                orderby mission.name
                select new DefaultEventType(project.tierLevel.TryParseEnum<GanttType>(GanttType.Unknown), DefaultCategoryRepository.CreateFrom(project.tDefaultCategory))
                {
                    AllowNumericSuffix = project.allowNumericSuffix,
                    AttachMilestoneMoniker = project.attachMilestoneMoniker,
                    Description = project.description,
                    Id = project.id,
                    IsReadOnly = project.isReadOnly,
                    IsSticky = project.isSticky,
                    Name = project.name,
                    Sid = project.sid,
                    Style = project.style.TryParseEnum<GanttElementStyle>(GanttElementStyle.Unknown),
                    TimeStamp = project.createdDT,
                    UpdatedTimeStamp = project.updatedDT,
                    Activity = new Activity { Id = activity.id, Name = activity.name, Mission = new Mission { Id = mission.id, Name = mission.name } }
                };

        var q2 = q.GroupBy(row => row.Activity.Mission.Id)
            .Select(group => group.GroupBy(row => row.Activity.Id));

        return q2.Cast<DefaultEventType>().ToList();
    }

リターンで失敗します。私はたくさんのグーグル検索とボード検索を行いました。明らかに、GroupBy の何かが原因で型が一致していませんが、なぜこれが機能しないのか正確にはわかりません。

誰でも洞察を提供できますか、またはこれを修正するにはどうすればよいですか?

編集:ツリーのような構造を出力しようとしています。現在、次のようになっています。

* Parent1
    * Child1
        *ChildChild1

* Parent1
    * Child1
        * ChildChild2

* Parent1
    * Child1
        * ChildChild3

私がやりたいのは、次のようにグループ化することです。

* Parent1
    * Child1
        * ChildChild1
        * ChildChild2
        * ChildChild3
4

1 に答える 1

4

編集:わかりました。フラットだけでなく、ある種の階層構造を返そうとしているList<DefaultEventType>ので、戻りタイプを変更する必要があります。

あなたの「親」は、、「Mission子」はActivity、、「子」は。のようDefaultEventTypeです。

基本的に、2つのカスタムタイプが必要です。

// Holds an Activity, and all the DefaultEventTypes corresponding to it.
class ActivityWithEvents {
    public Activity Activity { get; set; }
    public IEnumerable<DefaultEventType> Events { get; set; }
}

// Holds a Mission, and all the Activities corresponding to it.
class MissionWithActivities {
    public Mission Mission { get; set; }
    public IEnumerable<ActivityWithEvents> Activities { get; set; }
}

または同様のもの。メソッドのシグネチャを次のように変更する必要があります

public IEnumerable<MissionWithActivities> GetTierTree()

とあなたの復帰

var q2 = q.GroupBy(
    // First group the events by Mision
    e => e.Activity.Mission.Id,
    // For each mission found, select a MissionWithActivities
    (mid, events) => new MissionWithActivities {
        Mission = events.First().Activity.Mission,
        Activities = events.GroupBy(
            // Within the Mission, group the events by Activity
            e => e.Activity.Id,
            // For each Activity found, select an ActivityWithEvents
            (aid, events2) => new ActivityWithEvents {
                Activity = events2.First().Activity,
                Tasks = events2
            })
        });
return q2.ToList();

これで、それぞれを繰り返してMissionWithActivities表示することができます。そして、それぞれについて、その中を繰り返し、ActivityWithEventsそれらを表示します。そして、それぞれについて、そのを繰り返し、DefaultEventTypesそれらを表示します。

foreach (var mwa in GetTierTree())
{
    Console.WriteLine(mwa.Mission.Name);
    foreach (var awe in mwa.Activities)
    {
        Console.WriteLine("    " + awe.Activity.Name);
        foreach(var e in awe.Events)
            Console.WriteLine("        " + e.Name);
    }
}
于 2012-12-04T16:08:10.277 に答える