2017-06-20 61 views
1

我有以下用於將任務分配給員工的類。Linq group by,然後只能得到其中的一項

public class TaskDetails 
    { 
     public int TaskGroupId { get; set; } 
     public int TaskId { get; set; } 
     public string AssignedTo { get; set; } 
     public string TaskName { get; set; } 

    } 

通常我們得到工作組的名單和他們是誰賦予像下面,每個任務下TaskGroupId,每組因爲我們有一個特定的任務id,誰每個任務下分組負責它。

List<TaskDetails> tasks = new List<TaskDetails> 
      { 
       new TaskDetails 
       { 
        AssignedTo = "JOHN", 
        TaskGroupId = 100, 
        TaskId = 1, 
        TaskName = "FA" 
       }, 
       new TaskDetails 
       { 
        AssignedTo = "TOM", 
        TaskGroupId = 100, 
        TaskId = 1, 
        TaskName = "FA" 
       }, 
       new TaskDetails 
       { 
        AssignedTo = "JOHN", 
        TaskGroupId = 100, 
        TaskId = 2, 
        TaskName = "GH" 
       }, 
       new TaskDetails 
       { 
        AssignedTo = "TOM", 
        TaskGroupId = 100, 
        TaskId = 2, 
        TaskName = "GH" 
       }, 
       new TaskDetails 
       { 
        AssignedTo = "JOHN", 
        TaskGroupId = 99, 
        TaskId = 1, 
        TaskName = "XY" 
       }, 
       new TaskDetails 
       { 
        AssignedTo = "TOM", 
        TaskGroupId = 99, 
        TaskId = 1, 
        TaskName = "XY" 
       }, 
       new TaskDetails 
       { 
        AssignedTo = "JOHN", 
        TaskGroupId = 99, 
        TaskId = 2, 
        TaskName = "YX" 
       }, 
       new TaskDetails 
       { 
        AssignedTo = "TOM", 
        TaskGroupId = 99, 
        TaskId = 2, 
        TaskName = "YX" 
       } 
      }; 

我所試圖做的是組由TaskGroupIdAssignedTo每一項任務,但是,如果一個任務被分配給一個以上的人,我只需要找回他們的一回,在上面的例子中,任務1被分配給John和Tom,但我只需要其中的一個,哪一個(可能是Tom或John)並不重要。我已經嘗試了以下內容,但它正在檢索4個結果以及John和Tom,如截圖所示。我可以從GroupBy語句中刪除x.AssignedTo,它給了我2個結果,但是這些任務隨後在TaskLegs部分中重複,因此也沒有用。

enter image description here

var result = tasks 
    .GroupBy(x => new { 
     x.TaskGroupId, 
     x.AssignedTo }) 
    .Select(group => new { 
     GroupDetails = group.Key, 
     TaskLegs = group 
     .OrderBy(x => x.TaskId) 
     .ToList() }) 
    .ToList(); 

反正是有分組結果的方式,所以我只能檢索從分組的結果集的結果之一嗎?基於上面的例子中,我試圖讓2分的結果,一個任務組100和一個任務組99

感謝

+2

如果只有'.First()'擴展方法... – maccettura

回答

3

如果你只是想通過每場然後TaskGroupId你只組一個項目。按TaskGroupIdAssignedTo分組意味着您將爲這兩個組合中的每個組合獲得一個組,這就是爲什麼您獲得四個項目的原因。

所以,你的查詢必須啓動:

tasks.GroupBy (x => x.TaskGroupId) 

然後,您有兩個組(TaskGroupId 99和100)。

然後你需要選擇數據到你想要的形式。我有點不清楚這些數據應該採取什麼形式。它應該在每個組下面有一項任務嗎? 如果是這樣的:

.Select(group => new { TaskGroupId = group.Key, TaskLegs = group.OrderBy(x => x.TaskId).First() }). 

如果它應該有在那裏每一個不同的任務,那麼你就需要做一些更多的分組:

.Select(group => new { 
    TaskGroupId = group.Key, 
    TaskLegs = group 
     .GroupBy(x=>x.TaskId) 
     .Select(y => y.First()) 
     .OrderBy(y=>y.TaskId) 
}) 

這會給你兩個項目,每一個任務組。其中的每一項將在TaskLegs兩個項目,對於TaskID的1和2

獎金思想:

如果您想要列出分配給任務所有的人,你可以在你的TaskLegs的定義修改爲:

TaskLegs = group 
    .GroupBy(x=>x.TaskId) 
    .Select(y => new { 
     TaskId = y.Key, 
     AssignedTo = y.Select(z => z.AssignedTo) 
    }) 
    .OrderBy(y=>y.TaskId) 
0

試試這個..

var result = tasks.GroupBy(x => new x.TaskGroupId) .Select(group => new { GroupDetails = group.Key, TaskLegs = group.Take(1) }) .ToList();