2015-06-03 5 views
-3

У меня есть SQL результат, как, как следующие:Группировка результатов SQL с помощью LINQ

SehirID uniKodu 
34  014 
34  014 
34  014 
34  014 
41  176 
999  176 
46  070 
38  070 

и мне нужен словарь, как

Dictionary<uniKodu, Dictionary<SehirID, sumofSehirIDs>> 

это относится к

unikodu sehirId count 
014  34  4  
070  46  1  
070  38  1 
176  999 1 
176  41  1 

как я могу сделать это с помощью linq? Какие-либо предложения?

+1

Можете ли вы показать код, который у вас есть, для чтения значений из базы данных? –

+4

Ваш желаемый результат недействителен, так как ключ словаря должен быть уникальным. '70' и' 176' не уникальны. –

ответ

0

Что-то вроде этого:

//From the Database (assuming something like this) 
var result = Enumerable.Range(1, 1).Select(i => new { SehirId = 1, uniKodu =1 }); 

var dict = result 
    .GroupBy(r => r.uniKodu) 
    .ToDictionary(g => g.Key, g => g.ToDictionary(r => r.SehirId, g.Sum(r => r.SehirId))); 
+0

Вам также нужно сгруппировать внутренние группы с помощью 'SehirId' (и вместо' Sum') использовать 'Count'. –

1

Вашего желаемого результата является недействительным, поскольку ключ словаря должен быть уникальным. 70 и 176 не являются уникальными. Но вы могли бы использовать подобную коллекцию, созданную ToLookup:

var uniKoduLookup = db.Table.ToLookup(x => x.uniKodu); 

Если вы теперь хотите знать sehirID х uniKodu=14 и их подсчета вы делаете:

var uniKodu14 = uniKoduLookup[14]; // returns an empty sequence if it isn't contained 
int count = uniKodu14.Count(); 
List<int> sehirIDs = uniKoduLookup.Select(x=> sehirId).ToList(); 
0

Что-то вроде

var dict = result 
    .GroupBy(o => new {o.SehirID, o.uniKodu}) 
    .ToDictionary(
     g => g.Key.uniKodu, 
     g => g.ToDictionary(
      r => r.SehirId, 
      r => g.Count(r.SehirId) 
     ) 
    ); 
Смежные вопросы