powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / группировка таблицы по нескольким полям
17 сообщений из 17, страница 1 из 1
группировка таблицы по нескольким полям
    #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
группировка таблицы по нескольким полям
    #38696970
Фотография buser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
как-то так
...
Рейтинг: 0 / 0
группировка таблицы по нескольким полям
    #38696982
OlgaM123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо, но тут только по одному полю.
Если проигнорировать что нужно посчитать сумму, то группировка по одному полю работает так:
Код: c#
1.
  Dt = Dt.AsEnumerable().GroupBy(o => o["ko"]).Select(g => g.First()).CopyToDataTable();


Но как сгруппировать по нескольким полям и посчитать сумму я не знаю.
...
Рейтинг: 0 / 0
группировка таблицы по нескольким полям
    #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
группировка таблицы по нескольким полям
    #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
группировка таблицы по нескольким полям
    #38698081
petalvik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OlgaM123
Код: c#
1.
from t in Dt.AsEnumerable()


Вот это AsEnumerable() означает, что дальнейший запрос будет выполняться на клиенте, то есть будут получены все данные. Оно действительно надо? Также это означает, что операции суммирования будут происходить на клиенте, а не в БД. Поэтому и приведение не получается, ведь оно уже не в БД происходит.
...
Рейтинг: 0 / 0
группировка таблицы по нескольким полям
    #38698137
OlgaM123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
petalvik , у меня все происходит на стороне клиента, таблица Dt находится в памяти, а не в SQL.
...
Рейтинг: 0 / 0
группировка таблицы по нескольким полям
    #38698145
Фотография buser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что по тексту ошибки не понятно?
Эм... Field<object> это что?
zn_term и zn_osn часом не string?
...
Рейтинг: 0 / 0
группировка таблицы по нескольким полям
    #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
группировка таблицы по нескольким полям
    #38699023
Фотография buser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не хранить числа как строки...
...
Рейтинг: 0 / 0
группировка таблицы по нескольким полям
    #38699168
OlgaM123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
buser, что конкретно имеется ввиду? Что значит не хранить числа как строки? Они же вроде не строки, строка только поле tabl_name.
Если имеется ввиду Field<object>, то компилятор не дает поставить ни какой другой тип.
...
Рейтинг: 0 / 0
группировка таблицы по нескольким полям
    #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
группировка таблицы по нескольким полям
    #38699930
OlgaM123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
buser, спасибо. еще пожалуйста подскажите какую библиотеку нужно подключить что бы метод Dump заработал ;)
...
Рейтинг: 0 / 0
группировка таблицы по нескольким полям
    #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
группировка таблицы по нескольким полям
    #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
группировка таблицы по нескольким полям
    #38700020
Фотография buser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
т.е. этот метод просто сериализует объект в виде удобном для показа в output LinqPad'а
...
Рейтинг: 0 / 0
группировка таблицы по нескольким полям
    #38700071
OlgaM123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
buser, спасибо )
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / группировка таблицы по нескольким полям
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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