2015-03-26 1 views
2

У меня возникли проблемы с созданием группы оператором linq, который проектируется в список Foo, в котором каждый Foo также может содержать список Bar. В моем случае ни один из классов не имеет конструкторов без параметров, поэтому я немного теряюсь в синтаксисе.linq group by с проекцией на класс с безпараметрическим конструктором

https://dotnetfiddle.net/9zplqa

public class linqGrouping 
{ 

    public linqGrouping() 
    { 
     var data = this 
      .TestData() 
      .GroupBy(gb => new { gb.GroupProperty, gb.RandomProperty }) 
      .Select(s => new Foo(
       s.Key.GroupProperty, 
       s.Key.RandomProperty, 
       // Here's where I'm having issues, I was the non key parts of the group to be placed into a list of bar, I'm not sure how to access the "Values" as opposed to the Key 
       new List<Bar>() 
       { 
         // vvv Here's my problem area vvv // 
        //new Bar(someProperty, someOtherProperty) 
         // ^^^ Here's my problem area ^^^ // 
       } 
      )); 

     // The Expected object I'm hoping to create would be: 
     List<Foo> foo = new List<Foo>() 
     { 
      new Foo(1, 1, new List<Bar>() 
        { 
         new Bar(1, "test"), 
         new Bar(2, "test2") 
        }), 
      new Foo(2, 1, new List<Bar>() 
        { 
         new Bar(1, "test") 
        }) 
     }; 
    } 

    public List<RawData> TestData() 
    { 
     List<RawData> data = new List<RawData>(); 

     data.Add(new RawData() 
       { 
        GroupProperty = 1, 
        RandomProperty = 1, 
        SomeOtherProperty = "test", 
        SomeProperty = 1 
       }); 

     data.Add(new RawData() 
       { 
        GroupProperty = 1, 
        RandomProperty = 1, 
        SomeOtherProperty = "test2", 
        SomeProperty = 2 
       }); 

     data.Add(new RawData() 
       { 
        GroupProperty = 2, 
        RandomProperty = 1, 
        SomeOtherProperty = "test", 
        SomeProperty = 1 
       }); 

     return data; 
    } 

} 

public class RawData 
{ 
    public int GroupProperty { get; set; } 
    public int RandomProperty { get; set; } 
    public int SomeProperty { get; set; } 
    public string SomeOtherProperty { get; set; } 
} 

public class Foo 
{ 
    public int GroupProperty { get; private set; } 
    public int RandomProperty { get; private set; } 
    public List<Bar> Bars { get; private set; } 

    public Foo(int groupProperty, int randomProperty, List<Bar> bars) 
    { 
     this.GroupProperty = groupProperty; 
     this.RandomProperty = randomProperty; 
     this.Bars = bars; 
    } 
} 

public class Bar 
{ 
    public int SomeProperty { get; private set; } 
    public string SomeOtherProperty { get; private set; } 

    public Bar(int someProperty, string someOtherProperty) 
    { 
     this.SomeProperty = someProperty; 
     this.SomeOtherProperty = someOtherProperty; 
    } 
} 

Как я могу идти об этом? Есть ли лучший способ сделать это, чем направление, в котором я собираюсь?

ответ

4

Для выбора двух других свойств из группировки в коллекции Bar, вы можете просто сделать:

var data = this.TestData() 
    .GroupBy(gb => new { gb.GroupProperty, gb.RandomProperty }) 
    .Select(s => new Foo(
     s.Key.GroupProperty, 
     s.Key.RandomProperty, 
     s.Select(b => new Bar(b.SomeProperty, b.someOtherProperty)).ToList()) 
     )); 
+0

спасибо! Достаточно легко ... может быть, на днях я действительно получу * linq и как это работает :( – Kritner