2014-02-11 3 views
1

Я пытаюсь построить запрос LINQ в C#, который даст мне список различных значений из столбца в наборе данных с подсчетом для каждой строки. Результаты будут выглядеть так.Запрос LINQ с отличным подсчетом

State Count 
AL  55 
AK  40 
AZ  2 

Вот SQL, который это делает.

SELECT name, COUNT(*) AS count 
    FROM architecture arch 
    GROUP BY name 
    ORDER BY name 

Я вычислил LINQ, чтобы получить значения DISTINCT, которые есть.

var query = ds.Tables[0].AsEnumerable() 
    .OrderBy(dr1 => dr1.Field<string>("state")) 
    .Select(dr1 => new {state = dr1.Field<string>("state")}) 
    .Distinct().ToList(); 

Но я не могу понять, как получить COUNT (*) для каждого отдельного значения для работы в LINQ. Любая идея, как я могу добавить это в запрос LINQ?

ответ

4

Вы должны группировать результаты, основанные на State и SELECT COUNT из группы, как:

var query = ds.Tables[0].AsEnumerable() 
      .GroupBy(r => r.Field<string>("state")) 
      .Select(grp => new 
          { 
           state = grp.Key, 
           Count = grp.Count() 
          }) 
      .OrderBy(o => o.state) 
      .ToList(); 
+0

Отсутствует или dicing, но избил меня :) –

+0

@SergeyBerezovskiy, спасибо за заказ :) – Habib

1

Почему заморачиваться с Distinct, когда вы можете перевести ваш SQL запрос LINQ почти слово в слово? Вы можете сделать это следующим образом:

var query = ds.Tables[0].AsEnumerable() 
    .GroupBy(dr1 => dr1.Field<string>("state")) 
    .Select(g => new { 
     State = g.Key 
    , Count = g.Count() 
    }) 
    .OrderBy(p => p.State) 
    .ToList(); 

Это создает список {State, Count} пара. Если вы предпочитаете словарь государства-к-счета, вы можете изменить свой запрос, как это:

var query = ds.Tables[0].AsEnumerable() 
    .GroupBy(dr1 => dr1.Field<string>("state")) 
    .ToDictionary(g => g.Key, g => g.Count()); 
+0

Я думаю, вам нужно 'AsEnumerable()' для 'DataTable' – user2711965

+0

@NewHire Вы правы, его' dr1.Field ("state") 'может быть несовместимым с' IQueryable '. Спасибо за комментарий! – dasblinkenlight

+0

Я думаю, это то, что меня отбрасывало, думая, что мне нужен Distinct. Благодарю. – John81

1

Я думаю, что вам нужно GroupBy

var query = ds.Tables[0].AsEnumerable() 
       .GroupBy(dr1 => dr1.Field<string>("state")) 
       .Select(g => new {state = g.Key, count = g.Count()) 
       .ToList(); 
0
var query = ds.Tables[0].AsEnumerable() 
       .GroupBy(x=>x.Field<string>("state")) 
       .Select(g => new{ 
        state = g.Key, 
        count = g.Count() 
       }); 
2

Group все строки по значению состояния колонка. Затем упорядочьте группы, сгруппировав ключ. И последний шаг - проект каждой группа в анонимный объект с ключом группировки (состояние) и количеством строк в группе:

var query = ds.Tables[0].AsEnumerable() 
       .GroupBy(r => r.Field<string>("state")) 
       .OrderBy(g => g.Key) 
       .Select(g => new { State = g.Key, Count = g.Count() }) 
       .ToList(); 

Синтаксиса запросов будет выглядеть (я пропущу преобразование в список, чтобы избежать смешивания синтаксиса):

var query = from r in ds.Tables[0].AsEnumerable() 
      group r by r.Field<string>("state") into g 
      orderby g.Key 
      select new { 
       State = g.Key, 
       Count = g.Count() 
      }; 
0

Угадайте, что эквивалентно group by является group by :)

 var query = from dr1 in ds.Tables[0].AsEnumerable() 
        group dr1 by dr1.Field<string>("state") into state 
        select new { State = state.Key, Count = state.Count() }; 
0
var stat = from row in ds.Tables[0].AsEnumerable() 
group row by new 
{ 
    Col1 = row["Name"], 
} into TotalCount 
select new 
{ 
    ActionName = TotalCount.Key.Col1, 
    ActionCount = TotalCount.Count(), 
}; 
Смежные вопросы