2016-04-20 7 views
2

Я пытаюсь сгруппировать список элементов, используя LINQ для отображения в ретрансляторе. У меня есть запрос, который почти делает то, что мне нужно, но не совсем.Вложенная группа с LINQ

Мои данные выглядит

Cart object 
{ID: 10, isInventory: True, Pricing: 4}, 
{ID: 10, isInventory: True, Pricing: 20}, 
{ID: 10, isInventory: False, Pricing: 5}, 
{ID: 10, isInventory: False, Pricing: 23}, 
{ID: 74, isInventory: False, Pricing: 7} 

И я хочу группе isInventory, то группе каждый из них по идентификатору. В настоящее время у меня есть запрос, который близок, но все еще не так.

var grouped = from cart in shoppingCart.Cart 
         group cart by cart.IsInventoryStorage into Cart1 
         from CartGroup in 
          (from cart in Cart1 
          group cart by cart.BranchID) 
         group CartGroup by CartGroup.Key; 

Похоже, сгруппированных правильно, но Keys на isInventory, и я бы в идеале хочу быть key.isInventory то каждая из этих групп будут отсортированы по key.ID.

Благодаря

+0

Если я вас правильно понял, вы не означают группу, путем Сортировать по. Затем последующий заказ должен использовать ThenBy, иначе он уничтожит первый заказ. – eftpotrm

+0

Если вы следуете инструкциям [Как создать вложенную группу (Руководство по программированию на C#)] (https://msdn.microsoft.com/en-us/library/bb545974.aspx), вы заметите, что синтаксис немного но в любом случае, в вашем случае «group CartGroup by CartGroup.Key' должна быть« group CartGroup by Cart1.Key' –

+1

Иван, вы поймали мою ошибку, это именно то, что проблема. Благодарю. – sully77

ответ

2

Это может быть сделано с orderby в синтаксисе запроса. Обратите внимание, что последующие условия упорядочения разделяются запятой.

void Main() 
{ 
    var cart = new List<Cart>(); 

    cart.Add(new Cart { ID = 10, isInventory = true, Pricing = 4 }); 
    cart.Add(new Cart { ID = 10, isInventory = true, Pricing = 20}); 
    cart.Add(new Cart { ID = 10, isInventory = false, Pricing = 5}); 
    cart.Add(new Cart { ID = 10, isInventory = false, Pricing = 23}); 
    cart.Add(new Cart { ID = 74, isInventory = false, Pricing = 7}); 

    var grouped = from c in cart 
        orderby c.isInventory, c.ID 
        select c; 

    grouped.Dump(); 
} 

public class Cart 
{ 
    public int ID { get; set; } 
    public bool isInventory { get; set; } 
    public int Pricing { get; set; } 

} 

Это выводит данные как таковые:

10 False 5 
74 False 7 
10 False 23 
10 True 4 
10 True 20 
+0

Это группирует элементы в списке, но не сгруппированы по ключу, как в приведенных выше ответах. – sully77

1
var cart=new []{ 
    new {ID= 10, isInventory= true, Pricing= 4}, 
    new {ID= 10, isInventory= true, Pricing= 20}, 
    new {ID= 10, isInventory= false, Pricing= 5}, 
    new {ID= 10, isInventory= false, Pricing= 23}, 
    new {ID= 74, isInventory= false, Pricing= 7} 
}; 

var results=cart.GroupBy(c=>c.isInventory) 
    .SelectMany(grp1=>grp1.GroupBy(th=>th.ID),(grp1,grp2)=>new {grp1=grp1,grp2=grp2}) 
    .GroupBy(temp0=>temp0.grp1.Key,temp0=>temp0.grp2) 
    .Dump(); 

Результаты:

enter image description here

Смежные вопросы