Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / LINQ и group / 17 сообщений из 17, страница 1 из 1
28.05.2013, 18:30
    #38277293
medoed
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LINQ и group
Здравствуйте!
Вопрос прост, но я только приступил к изучению LINQ. Что то не пойму как с group by работать.
Подскажите плиз

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
var mg = new [] { 1, 2, 3, 4, 5, 6, 7,2,4};

            var QW = from ii in mg
                     where ii > 1
                     group mg by ii;
                     //select new ii;

            foreach(var per in QW)
            {
                MessageBox.Show("Переменная равна = :" + per.ToString());
            }



на SQL синтаксисе это будет как то так:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
  with t as (select 1 as col1 from SYSIBM.SYSDUMMY1 
           union all 
           select 2 from SYSIBM.SYSDUMMY1
           union all 
           select 3 from SYSIBM.SYSDUMMY1
           union all 
           select 4 from SYSIBM.SYSDUMMY1
           union all 
           select 2 from SYSIBM.SYSDUMMY1
           union all 
           select 5 from SYSIBM.SYSDUMMY1
           )
           select col1 from t group by col1;     



Выдается какая то системная ересь. Как правильно вывести resultset?
Спасибо!
...
Рейтинг: 0 / 0
28.05.2013, 18:40
    #38277315
Charles Weyland
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LINQ и group
как группировать, я писал здесь, прямо в вопросе, буквально вчера (поиск!)
http://www.sql.ru/forum/1025519/linq-gruppirovka-po-dvum-polyam

а считывать в твоём случае так:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
//по группам
for (var qw in QW)
{
   //внутри каждой группы
   for(var q in qw)
   {
   }
}
...
Рейтинг: 0 / 0
28.05.2013, 18:43
    #38277321
medoed
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LINQ и group
Charles Weylandкак группировать, я писал здесь, прямо в вопросе, буквально вчера (поиск!)
http://www.sql.ru/forum/1025519/linq-gruppirovka-po-dvum-polyam

а считывать в твоём случае так:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
//по группам
for (var qw in QW)
{
   //внутри каждой группы
   for(var q in qw)
   {
   }
}



Дык я твой пост видел, но у тебя группировка по 2-м полям. А у меня вроде по одному...
...
Рейтинг: 0 / 0
28.05.2013, 18:46
    #38277328
Charles Weyland
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LINQ и group
medoedCharles Weylandкак группировать, я писал здесь, прямо в вопросе, буквально вчера (поиск!)
http://www.sql.ru/forum/1025519/linq-gruppirovka-po-dvum-polyam

а считывать в твоём случае так:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
//по группам
for (var qw in QW)
{
   //внутри каждой группы
   for(var q in qw)
   {
   }
}




Дык я твой пост видел, но у тебя группировка по 2-м полям. А у меня вроде по одному...
эм.. ну.. в вопросе у меня содержится запрос с группировкой и он корректен.
...
Рейтинг: 0 / 0
28.05.2013, 18:55
    #38277345
medoed
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LINQ и group
Charles Weylandэм.. ну.. в вопросе у меня содержится запрос с группировкой и он корректен.

Дык я переделал свой запрос, но что то не помогает:

var mg = new [] { 1, 2, 3, 4, 5, 6, 7,2,4};
var QW = from ii in mg
where ii > 1
group mg by ii into res
select res;

foreach(var per in QW)
{
MessageBox.Show("Переменная равна = :" + per.ToString());
}
...
Рейтинг: 0 / 0
28.05.2013, 19:04
    #38277362
Charles Weyland
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LINQ и group
medoedCharles Weylandэм.. ну.. в вопросе у меня содержится запрос с группировкой и он корректен.

Дык я переделал свой запрос, но что то не помогает:

var mg = new [] { 1, 2, 3, 4, 5, 6, 7,2,4};
var QW = from ii in mg
where ii > 1
group mg by ii into res
select res;

foreach(var per in QW)
{
MessageBox.Show("Переменная равна = :" + per.ToString());
}
per - это группа, для того, чтобы углубиться во внутрь этой группы и добраться до сгруппированных чисел, нужен второй for.
Также ты можешь использовать distinct(), или, логичнее в твоём случае, First или Last
...
Рейтинг: 0 / 0
29.05.2013, 10:37
    #38277967
medoed
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LINQ и group
Charles Weylandmedoedпропущено...


Дык я переделал свой запрос, но что то не помогает:

var mg = new [] { 1, 2, 3, 4, 5, 6, 7,2,4};
var QW = from ii in mg
where ii > 1
group mg by ii into res
select res;

foreach(var per in QW)
{
MessageBox.Show("Переменная равна = :" + per.ToString());
}
per - это группа, для того, чтобы углубиться во внутрь этой группы и добраться до сгруппированных чисел, нужен второй for.
Также ты можешь использовать distinct(), или, логичнее в твоём случае, First или Last

Переписал вот так, как вы советовали цифры стали выводиться, но почему то группировки нет...

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
 var mg = new [] { 1, 2, 3, 4, 5, 6, 7,2,4};
            var QW = from ii in mg
                     where ii > 1
                     group mg by ii into res
                     select mg;

            foreach(var per in QW)
            {
                foreach (var per_int in per)
                {
                    MessageBox.Show("Переменная равна = :" + per_int.ToString());
                }
            }
...
Рейтинг: 0 / 0
29.05.2013, 10:59
    #38278040
Charles Weyland
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LINQ и group
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
 var mg = new [] { 1, 2, 3, 4, 5, 6, 7,2,4};
            var QW = from ii in mg
                     where ii > 1
                     group mg by ii into res
                     select mg;

            foreach(var per in QW)
            {
                foreach (var per_int in per)
                {
                    MessageBox.Show("Переменная равна = :" + per_int.ToString());
		break; //Дописал
                }
            }


ну, самый топорный способ в данном случае - дописать break (дописал), и это будет работать.
Но в мало-мальски приличном обществе за наличие break ругать будут.
Но лучше вместо этого использовать
per.First() -взять первый элемент из списка
или

per.Last() - взять последний элемент из списка
разберись, как
...
Рейтинг: 0 / 0
29.05.2013, 11:01
    #38278047
Charles Weyland
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LINQ и group
А, и ещё, вместо
Код: c#
1.
MessageBox.Show("ох и ах");


используй
Код: c#
1.
Console.WriteLine("ох и ах");


и смотри результаты на панели "Вывод" (Output)
...
Рейтинг: 0 / 0
29.05.2013, 11:05
    #38278060
medoed
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LINQ и group
Charles Weyland
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
 var mg = new [] { 1, 2, 3, 4, 5, 6, 7,2,4};
            var QW = from ii in mg
                     where ii > 1
                     group mg by ii into res
                     select mg;

            foreach(var per in QW)
            {
                foreach (var per_int in per)
                {
                    MessageBox.Show("Переменная равна = :" + per_int.ToString());
		break; //Дописал
                }
            }


ну, самый топорный способ в данном случае - дописать break (дописал), и это будет работать.
Но в мало-мальски приличном обществе за наличие break ругать будут.
Но лучше вместо этого использовать
per.First() -взять первый элемент из списка
или

per.Last() - взять последний элемент из списка
разберись, как


Не работает - Выводится все время 1 (первый элемент).
Расскажите, как хотя бы с этот запрос будет выглядеть?
...
Рейтинг: 0 / 0
29.05.2013, 11:09
    #38278075
medoed
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LINQ и group
medoed,

Я имел в виду запрос с distinct
...
Рейтинг: 0 / 0
29.05.2013, 11:22
    #38278103
medoed
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LINQ и group
medoed,
Вроде получилось:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
var mg = new [] { 1, 2, 3, 4, 5, 6, 7,2,4};
            int i;
            var QW = from ii in mg
                     where ii > 1
                     group ii by ii into res
                     select res;
                     
            foreach(var per in QW)
            {
                foreach (var per_int in per.Distinct())
                {
                    MessageBox.Show("Переменная равна = :" + per_int.ToString());
                }
            }



P.S. Извратно по первости кажется синтаксис Linq - а, по сравнению с T-sql; Pl-sql и т.д..
...
Рейтинг: 0 / 0
29.05.2013, 12:27
    #38278240
LameUser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LINQ и group
medoedmedoed,
Вроде получилось:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
var mg = new [] { 1, 2, 3, 4, 5, 6, 7,2,4};
            int i;
            var QW = from ii in mg
                     where ii > 1
                     group ii by ii into res
                     select res;
                     
            foreach(var per in QW)
            {
                foreach (var per_int in per.Distinct())
                {
                    MessageBox.Show("Переменная равна = :" + per_int.ToString());
                }
            }



P.S. Извратно по первости кажется синтаксис Linq - а, по сравнению с T-sql; Pl-sql и т.д..

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

сделал бы так:

Код: c#
1.
2.
var result = mg.Where(element => element > 1).Distinct();
result.ToList().ForEach(element => MessageBox.Show("Переменная равна = :" + element));
...
Рейтинг: 0 / 0
29.05.2013, 12:37
    #38278252
LameUser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LINQ и group
Если по неизвестной мне причине необходимо все-таки оставить группипорвку - вывод ключей без вложенного цикла:

Код: c#
1.
2.
3.
4.
      foreach (var per in QW)
            {
                MessageBox.Show("Переменная равна = :" + per.Key);
            }
...
Рейтинг: 0 / 0
29.05.2013, 13:13
    #38278334
medoed
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LINQ и group
LameUserЕсли по неизвестной мне причине необходимо все-таки оставить группипорвку - вывод ключей без вложенного цикла:

Код: c#
1.
2.
3.
4.
      foreach (var per in QW)
            {
                MessageBox.Show("Переменная равна = :" + per.Key);
            }


Да задача проста - освоить основы LINQ, в частности группировку, поле одно - вывести уникальные значения и усё

На SQL это вот так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
 /*create table temp.testt (id integer);*/

 select id  
 from temp.testt
 where id >1 
 group by id
 order by id



А ваш вариант без цикла не работает (см картинку):
...
Рейтинг: 0 / 0
29.05.2013, 15:06
    #38278603
LameUser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LINQ и group
medoed,
Странно, должно работать.

Под какой фреймворк собираете?
...
Рейтинг: 0 / 0
29.05.2013, 15:24
    #38278637
medoed
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LINQ и group
LameUsermedoed,
Странно, должно работать.
Под какой фреймворк собираете?

Все разобрался у меня было
Код: c#
1.
select res.Distinct()

, поставил
Код: c#
1.
select res

и все стало ок!
Спасибо!
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / LINQ и group / 17 сообщений из 17, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]