Гость
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / группировка таблицы по нескольким полям / 17 сообщений из 17, страница 1 из 1
15.07.2014, 15:16
    #38696927
OlgaM123
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
группировка таблицы по нескольким полям
Всем доброе время суток.
Есть таблица DataTable со столбцами: table_name, ko, st, gr, zn1, zn2. Нужно сгруппировать по столбцам table_name, ko, st, gr, а столбцов zn1 и zn2 взять сумму.
В SQL запрос выглядит так:
Код: sql
1.
select table_name,ko, st, gr, sum(zn1), sum(zn2) from frm_data_1 group by table_name,ko, st, gr


Подскажите, пожалуйста, как это сделать с помощью LINQ.
...
Рейтинг: 0 / 0
15.07.2014, 15:44
    #38696970
buser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
группировка таблицы по нескольким полям
как-то так
...
Рейтинг: 0 / 0
15.07.2014, 15:53
    #38696982
OlgaM123
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
группировка таблицы по нескольким полям
Спасибо, но тут только по одному полю.
Если проигнорировать что нужно посчитать сумму, то группировка по одному полю работает так:
Код: c#
1.
  Dt = Dt.AsEnumerable().GroupBy(o => o["ko"]).Select(g => g.First()).CopyToDataTable();


Но как сгруппировать по нескольким полям и посчитать сумму я не знаю.
...
Рейтинг: 0 / 0
15.07.2014, 16:16
    #38697010
petalvik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
группировка таблицы по нескольким полям
OlgaM123,

чтобы сгруппировать по нескольким полям, их нужно объединить в один анонимный тип:

Код: c#
1.
2.
from x in frm_data_1
group by x new { x.table_name, x.ko, x.st, x.gr } into g
...
Рейтинг: 0 / 0
16.07.2014, 15:47
    #38698052
OlgaM123
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
группировка таблицы по нескольким полям
petalvik , спасибо. попробовала, получилось так:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
IEnumerable query = (from t in Dt.AsEnumerable()
                                 group t by new { test1 = t.Field<string>("tabl_name"), test2 = t.Field<object>("ko"), test3 = t.Field<object>("st"), test4 = t.Field<object>("gr") }
                                     into grp
                                     select new
                                     {
                                         grp.Key.test1,
                                         grp.Key.test2,
                                         grp.Key.test3,
                                         grp.Key.test4,
                                         Quantity1 = grp.Sum(t => t.Field<decimal>("zn_term")),
                                         Quantity2 = grp.Sum(t => t.Field<decimal>("zn_osn"))                                        
                                     }).ToList();


Теперь проблема с приведением типов. выдается ошибка "Заданное приведение является недопустимым." на строку : Quantity1 = grp.Sum(t => t.Field<decimal>("zn_term")),
В таблице тип поля zn_term: decimal. Значения этого поля - число вида хх.ххххх или 0
Пожалуйста, подскажите как решить эту проблему.
...
Рейтинг: 0 / 0
16.07.2014, 16:10
    #38698081
petalvik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
группировка таблицы по нескольким полям
OlgaM123
Код: c#
1.
from t in Dt.AsEnumerable()


Вот это AsEnumerable() означает, что дальнейший запрос будет выполняться на клиенте, то есть будут получены все данные. Оно действительно надо? Также это означает, что операции суммирования будут происходить на клиенте, а не в БД. Поэтому и приведение не получается, ведь оно уже не в БД происходит.
...
Рейтинг: 0 / 0
16.07.2014, 16:50
    #38698137
OlgaM123
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
группировка таблицы по нескольким полям
petalvik , у меня все происходит на стороне клиента, таблица Dt находится в памяти, а не в SQL.
...
Рейтинг: 0 / 0
16.07.2014, 16:55
    #38698145
buser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
группировка таблицы по нескольким полям
Что по тексту ошибки не понятно?
Эм... Field<object> это что?
zn_term и zn_osn часом не string?
...
Рейтинг: 0 / 0
17.07.2014, 12:27
    #38698876
OlgaM123
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
группировка таблицы по нескольким полям
buserЧто по тексту ошибки не понятно?
Эм... Field<object> это что?
zn_term и zn_osn часом не string?
zn_term и zn_osn не string, а decimal .
поле tabl_name типа string
поля ko и st типа Int64
поле gr типа Int16
Однако, при попытке указать реальные типы полей ko, st и gr ругается на тип поэтому пришлось использовать object.
Группировка работает верно, если исключить из запроса подсчет суммы.

Может кто подскажет как можно избавиться от ошибки приведения типов или как сделать это другим способом? ;)
...
Рейтинг: 0 / 0
17.07.2014, 13:40
    #38699023
buser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
группировка таблицы по нескольким полям
не хранить числа как строки...
...
Рейтинг: 0 / 0
17.07.2014, 14:47
    #38699168
OlgaM123
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
группировка таблицы по нескольким полям
buser, что конкретно имеется ввиду? Что значит не хранить числа как строки? Они же вроде не строки, строка только поле tabl_name.
Если имеется ввиду Field<object>, то компилятор не дает поставить ни какой другой тип.
...
Рейтинг: 0 / 0
17.07.2014, 16:03
    #38699322
buser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
группировка таблицы по нескольким полям
Если бы это было так... то все бы работало... проверил в блокнотике http://www.linqpad.net/

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
class SomeData
    {
        public string tabl_name;
        public decimal? zn_term;
        public decimal? zn_osn;
        public Int64? ko;
        public Int64? st;
        public Int16? gr;			
    }
	
static void PrintColumns(DataTable dt)
	{
		foreach (DataColumn column in dt.Columns)
		{
			column.Dump(column.ColumnName);
		}	
	}
	
static DataTable GetDataTable(SomeData[] sd)
        {
            DataTable table = new DataTable(); 
            table.Columns.Add("tabl_name",typeof(string));
            table.Columns.Add("zn_term",typeof(decimal));
            table.Columns.Add("zn_osn",typeof(decimal));
            table.Columns.Add("ko",typeof(Int64));
            table.Columns.Add("st",typeof(Int64));
            table.Columns.Add("gr",typeof(Int16));			
			
            foreach (SomeData d in sd)
            {
                table.Rows.Add(d.tabl_name, d.zn_term, d.zn_osn, d.ko, d.st, d.gr);
            }
            return (table);

        }	
		
void Main()
{
			SomeData[] samples = {
									new SomeData { tabl_name = "t1", zn_term = 12.589M, zn_osn = 34534.0M, ko = 10, st = 20, gr = 3},
									new SomeData { tabl_name = "t1", zn_term = 12.589M, zn_osn = 34534.0M, ko = 10, st = 20, gr = 3},
									new SomeData { tabl_name = "t1", zn_term = null, zn_osn = null, ko = 10, st = 20, gr = 3}
                                 };
								 					 
								
            DataTable dt_samples = GetDataTable(samples);	
			
			PrintColumns(dt_samples);
						
			IEnumerable query = (from t in dt_samples.AsEnumerable()
											group t by new { test1 = t.Field<string>("tabl_name"), test2 = t.Field<Int64?>("ko"), test3 = t.Field<Int64?>("st"), test4 = t.Field<Int16?>("gr") }
												into grp
												select new
												{
													grp.Key.test1,
													grp.Key.test2,
													grp.Key.test3,
													grp.Key.test4,
													Quantity1 = grp.Sum(t => t.Field<decimal?>("zn_term")),
													Quantity2 = grp.Sum(t => t.Field<decimal?>("zn_osn"))                                        
												}).ToList();			
			query.Dump();
			
}


...
Рейтинг: 0 / 0
18.07.2014, 09:14
    #38699930
OlgaM123
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
группировка таблицы по нескольким полям
buser, спасибо. еще пожалуйста подскажите какую библиотеку нужно подключить что бы метод Dump заработал ;)
...
Рейтинг: 0 / 0
18.07.2014, 09:30
    #38699953
OlgaM123
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
группировка таблицы по нескольким полям
buser, еще раз огромнейшее спасибо. проблему решила. ошибка была в следующем: колонки таблицы создавала так
Код: c#
1.
2.
3.
4.
5.
6.
            Dt.Columns.Add("tabl_name");
            Dt.Columns.Add("ko");
            Dt.Columns.Add("st");
            Dt.Columns.Add("gr");
            Dt.Columns.Add("zn_term");
            Dt.Columns.Add("zn_osn");


а нужно было так как делали Вы
Код: c#
1.
2.
3.
4.
5.
6.
            Dt.Columns.Add("tabl_name", typeof(string));
            Dt.Columns.Add("ko", typeof(Int64));
            Dt.Columns.Add("st", typeof(Int64));
            Dt.Columns.Add("gr", typeof(Int16));
            Dt.Columns.Add("zn_term", typeof(decimal));
            Dt.Columns.Add("zn_osn", typeof(decimal));


buser, но если не сложно то про метод Dump все-таки ответьте пожалуйста, интересно
...
Рейтинг: 0 / 0
18.07.2014, 10:13
    #38700012
buser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
группировка таблицы по нескольким полям
Dump() - плюшка (extension) для визуализации объектов, прикрученный в утилите http://www.linqpad.net/ (бесплатная хня), что используется для демонстраций и написания простых тестов...
Вот... есть кем-то писанный visualizer для студии, если я правильно понял... https://code.google.com/p/linqpadvisualizer/
В примерах от мелкомягких есть [VS Path]\Samples\1033\CSharpSamples.zip\LinqSamples\ObjectDumper
...
Рейтинг: 0 / 0
18.07.2014, 10:16
    #38700020
buser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
группировка таблицы по нескольким полям
т.е. этот метод просто сериализует объект в виде удобном для показа в output LinqPad'а
...
Рейтинг: 0 / 0
18.07.2014, 10:52
    #38700071
OlgaM123
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
группировка таблицы по нескольким полям
buser, спасибо )
...
Рейтинг: 0 / 0
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / группировка таблицы по нескольким полям / 17 сообщений из 17, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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