2013-04-10 3 views
2

코드로 더 자세히 설명합니다. 다음 쿼리를 사용합니다 :전체 개체 액세스 권한이있는 LINQ 그룹화

var items = context.Items.GroupBy(g => new {g.Name, g.Model}) 
       .Where(/*...*/) 
       .Select(i => new ItemModel{ 
           Name=g.Key.Name, 
           SerialNumber = g.FirstOrDefault().SerialNumber //<-- here 
            }); 

키에 사용되지 않은 일련 번호 또는 다른 속성을 얻는 더 좋은 방법이 있습니까? 내가 생각할 수있는 유일한 방법은 FirstOrDefault를 사용하는 것이다.

+0

그룹화하면 개체 목록이 반환됩니다. 나는 그곳의 문제가 무엇인지를 정말로 이해하지 못한다. 대개 groupby를 사용하면 첫 번째 항목 (또는 'LastOrDefault'와 함께 마지막 항목)뿐만 아니라 목록을 사용하려고합니다. 무엇을해야합니까 (또는 알 필요가 있습니까)? –

+0

@GabrielGM, 특정 관련 속성별로 항목을 그룹화하고 싶지만 개체를 ​​선택할 때 'Key'에있는 속성뿐만 아니라 해당 항목의 모든 속성에 액세스하려고합니다. 일련 번호별로 그룹화하지 않았으므로 'g.Key.SerialNumber'를 수행 할 수 없습니다. –

답변

1

당신이 선언하고있는 익명 형식을 통해 키의 일부로 : 또는

var items = context.Items.GroupBy(g => new {g.Name, g.Model, g.SerialNumber }) 
      .Where(/*...*/) 
      .Select(i => new ItemModel { 
        Name=g.Key.Name, 
        SerialNumber = g.FirstOrDefault().SerialNumber //<-- here 
      }); 

또는, 개체 키 만들기 : 때때로

var items = context.Items.Where(...).GroupBy(g => g) 
    .Select(i => new ItemModel {...}); 

쿼리 구문을 이해하는 것이 더 쉬울 수 있습니다 (여기서는 Item 개체를 키의 일부로 투영했습니다).

var items = from i in context.Items 
      group i by new { Serial = g.Serialnumber, Item = g } into gi 
      where /* gi.Key.Item.GetType() == typeof(context.Items[0]) */ 
      select new ItemModel { 
       Name = gi.Key.Name, 
       SerialNumber = gi.Key.Serial 
       /*...*/ 
      }; 

편집 :

var items = context.Items.Where(/*...*/).Select(i => new ItemModel { /*...*/}) 
    .GroupBy(g => new { g.Name, g.Model }); 

당신이 키와 group by 사용자의 임의에이에서 IGrouping<AnonymousType``1, IEnumerable<ItemModel>>을 얻고, 그룹화 된 컬렉션으로 당신의 ItemModels : 당신과 같이 투사 한 후 그룹화 시도 할 수 있습니다.

+0

일련 번호로 그룹화하고 싶지 않습니다. 내 모델에는 원하지만 그룹화하지 않으려는 일련 번호 이외의 다른 속성이 있습니다. –

+0

그러면 모델 투영 후 원하는대로 그룹화하십시오. 데모가있는 내 게시물을 편집하겠습니다 –

+0

좋아,이 사진이 더 의미가 있습니다. 감사합니다. –

0

모든 데이터가 필요하므로 모든 그룹 데이터를 KeyValuePair의 값으로 저장해야합니다.

내가 내 앞에 정확한 구문을 가지고 있지 않지만, 그것이 같을 것이다 : 그 후

/* ... */ 
.Select(g => new { 
        Key = g.key, 
        Values = g 
       }); 

, 당신은 당신의 Name 그룹을 Key을 통해 루프를 얻을 수 있습니다. 그 루프 안에는 Values을 통해 루프를 포함하여 ItemModel을 얻을 수 있습니다 (1 요소가 들어있는 객체라고 생각합니다). 이 도움이

foreach (var g in items) 
{ 
    Console.WriteLine("List of SerialNumber in {0} group", g.Key); 
    foreach (var i in g.Values) 
    { 
     Console.WriteLine(i.SerialNumber); 
    } 
} 

희망 :

그것은처럼 보일 것입니다!

다른 검색어에 대한 도움말은 Linq 101 samples을 참조하십시오.

0

일련 번호가 이름과 모델에 고유하면 개체별로 그룹에 포함해야합니다.

그렇지 않은 경우 이름과 모델별로 일련 번호 목록이 있으며 firstordefault를 선택하면 문제가 생길 가능성이 높습니다. 즉, 원하는 시나리오가 없다고 생각할 수 있습니다.

그냥 일련 번호를 포함하지 왜
+0

시리얼이 그룹화 할 키가 아니기 때문에. –

+2

내가 오해하지 않는 한, 당신은 Serial으로 그룹화하기를 원하는 것처럼 보입니다 : 고유 한 (이름, 모델, 시리얼) 튜플 그룹이 필요합니다. 이 경우 Serial은 실제로 그룹화하려는 키입니다. 그렇지 않다면, 나는 당신이 원하는 것을 전혀 이해하지 못합니다. – Martijn

+0

고마움, 내 의견을 통해 내 결함을 보게했습니다 –

1

내가하는 일에 강력히 권고드립니다. 귀하의 질의에 주문을하지 않으므로 일련 번호가 임의로 선택됩니다. 쿼리가 "지난 시간"과 다른 순서로 항목을 반환하는 경우 놀랄 일이없는 방식을 선택하기 위해 정확히 어떤 일련 번호를 지정하면 더 좋을 것입니다.

이렇게 말하면 그룹화를 투영하고 필요한 필드를 선택하고 첫 번째 결과를 얻는 것이 더 깔끔할 것이라고 생각합니다. 그들 모두는 동일한 키 값을 가지므로 동일하게 유지되며 원하는 다른 필드에 추가 할 수 있습니다.

var items = context.Items.GroupBy(i => new { i.Name, i.Model }) 
    .Where(/*...*/) 
    .Select(g => 
     g.OrderBy(i => i.Name).Select(i => new ItemModel 
     { 
      Name = i.Name, 
      SerialNumber = i.SerialNumber, 
     }).FirstOrDefault() 
    ); 
+0

감사합니다. 첫 번째 단락에서 내 사진의 결함을 볼 수있게했습니다. 논리. –

관련 문제