2014-02-14 5 views
0

아래에 표시된 사용자 지정 목록이 있습니다. 내가하고 싶은 무엇C# Linq Groupby 및 Where

class ActionToDo 
{ 
    public string Name {get;set;} 
    public DateTime dtDate {get;set;} 
    public string EventCode {get;set;} 
    public string EventDescription {get;set;} 
} 

같은 날짜 & 같은 이벤트 설명 및 위치를 EventCode = "AQ"이 항목을 찾을 수 있습니다. 나는 이것을 달성하는 가장 좋은 방법은 LINQ을 추측하고 있습니까? 나는 LINQ을 사용하여 이것을하는 방법을 모른다.

내 머리에 Sql을 사용하면 대략 다음과 같을 것이라고 생각합니다.

SELECT * FROM SomeTable 
WHERE [EventDescription] = 'AQ' 
GROUP BY [dtDate], [EventDescription]  

답변

2
.Where(x=> x.EventDescription == "AQ") 
.GroupBy(x => new { x.dtDate.Date, x.EventDescription}) 
2

그래서는 LINQ 쿼리는 사용자의 요구 사항을 충족 쿼리 구문를 사용하여 표현된다 당신이 여기

List<ActionToDo> actionToDo = new List<ActionToDo>(); 
actionToDo.Where(i => i.EventDescription == "AQ" && i.EventCode="AQ") 
.GroupBy(i => new { i.dtDate.Date, i.EventDescription }); 
1

가 있다고 가정하자. 또한, 그것은 또한 Name에 의해 다음 그룹화 속성 dtDateEventDescription 각 그룹의 구성원을 정렬합니다

var actions = new List<ActionToDo>(); 
// populate 'actions' 

var results = 
    from a in actions 
    where a.EventCode == "AQ" 
    orderby a.dtDate, a.EventDescription, a.Name 
    group a by new { a.dtDate, a.EventDescription }; 

이 쿼리를 설명하기 위해 무작위로 일부 샘플 ActionToDo 데이터와 프로그램을 만들었습니다. 프로그램 자체의 형식화 된 결과물은 아래를 참조하십시오.

시범 프로그램 출력

[2014-02-12] [Desc.AQ.12] 
    AQ.12a 
    AQ.12b 
[2014-02-13] [Desc.AQ.13] 
    AQ.13a 
    AQ.13b 
    AQ.13c 
[2014-02-14] [Desc.AQ.14] 
    AQ.14a 
    AQ.14b 

데모 프로그램

using System; 
using System.Collections.Generic; 
using System.Linq; 

class GroupByDemo 
{ 
    static public void Main(string[] args) 
    { 
     var actions = new List<ActionToDo>() 
      { 
       new ActionToDo("AQ.14b", "2014-02-14", "AQ", "Desc.AQ.14"), 
       new ActionToDo("AQ.12a", "2014-02-12", "AQ", "Desc.AQ.12"), 
       new ActionToDo("AQ.13b", "2014-02-13", "AQ", "Desc.AQ.13"), 
       new ActionToDo("XX.01", "2014-02-01", "XX", "Desc.XX.01"), 
       new ActionToDo("AQ.14a", "2014-02-14", "AQ", "Desc.AQ.14"), 
       new ActionToDo("AQ.12b", "2014-02-12", "AQ", "Desc.AQ.12"), 
       new ActionToDo("AQ.13a", "2014-02-13", "AQ", "Desc.AQ.13"), 
       new ActionToDo("XX.02", "2014-02-02", "XX", "Desc.XX.02"), 
       new ActionToDo("AQ.13c", "2014-02-13", "AQ", "Desc.AQ.13"), 
       new ActionToDo("XX.03", "2014-02-03", "XX", "Desc.XX.03") 
      }; 

     var results = 
      from a in actions 
      where a.EventCode == "AQ" 
      orderby a.dtDate, a.EventDescription, a.Name 
      group a by new { a.dtDate, a.EventDescription }; 

     foreach (var group in results) 
     { 
      Console.WriteLine("[{0}] [{1}]", 
           group.Key.dtDate.ToString("yyyy-MM-dd"), 
           group.Key.EventDescription); 

      foreach (var action in group) 
      { 
       Console.WriteLine(" {0}", action.Name); 
      } 
     } 
    } 
} 

class ActionToDo 
{ 
    public string Name {get;set;} 
    public DateTime dtDate {get;set;} 
    public string EventCode {get;set;} 
    public string EventDescription {get;set;} 

    public ActionToDo(
     string name, 
     string dtDateString, 
     string eventCode, 
     string eventDescription) 
    { 
     this.Name = name; 
     this.dtDate = DateTime.Parse(dtDateString); 
     this.EventCode = eventCode; 
     this.EventDescription = eventDescription; 
    } 
}