Модераторы: gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вопрос по группировке 
V
    Опции темы
ДобренькийПапаша
Дата 22.6.2011, 08:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 14.1.2006
Где: г.Москва

Репутация: нет
Всего: 7



Есть два класса:
Код

class OperationRecord
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }
    class ServiceRecord
    {
        public int Id { get; set; }
        public string Price { get; set; }
    }


Нужно посчитать общую сумму на которую продано товара с определённым Id.
То есть, нужно объединить по id, сгруппировать по id, количество по Id умножить на price (для каждого Id).
Тыркаюсь-тыркаюсь и уже потерял веру в то, что это можно сделать на LINQ за один присест (хотя мне и за два пойдёт) smile


--------------------
Меня зовут Себастьян Парейра, торговец чёрным деревом.
PM MAIL   Вверх
-Mikle-
Дата 22.6.2011, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

Репутация: нет
Всего: 59



Из приведенного примера классов, я не понял как они связаны между собой. Уточни пример имеющихся данных.


--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
ДобренькийПапаша
Дата 22.6.2011, 20:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 14.1.2006
Где: г.Москва

Репутация: нет
Всего: 7



Я намеренно множество полей опустил - вот и стало непонятно, видимо. В OperationRecord записываются данные о продажах товаров. Цену конкретного товара мы можем узнать только сделав объединение по Id. Таким образом, ServiceRecord это список всех товаров, здесь содержатся все атрибуты конкретного типа товара. На несуразность не обращайте внимания. Просто я срезал почти все smile

Это сообщение отредактировал(а) ДобренькийПапаша - 22.6.2011, 20:12


--------------------
Меня зовут Себастьян Парейра, торговец чёрным деревом.
PM MAIL   Вверх
ДобренькийПапаша
Дата 23.6.2011, 10:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 14.1.2006
Где: г.Москва

Репутация: нет
Всего: 7



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

Значит так, когда я делаю так:
Код

var result = from op in operations
                         join s in services
                         on op.Id equals s.Id
                         group op by op.Id into res
                         select new
                         {
                             Key = res.Key,
                             Result = res
                         };


то:

Код

foreach (var item in result)
            {                
                foreach (var innerItem in item.Result)
                {
                    Console.WriteLine(innerItem.XXXX);  //Вижу здесь только члены класса OperationRecord, т.е. Id и Name
                }
            }


Если меняю группировку на:
Код

from s in services
                          join op in operations                         
                          on s.Id equals op.Id
                          group s by s.Id into res      //Суть группировки изменилась здесь
                          select new
                          {
                              Key = res.Key,
                              Result = res
                          };


то:
Код

foreach (var item in result)
            {                
                foreach (var innerItem in item.Result)
                {
                    Console.WriteLine(innerItem.XXXX);  //Вижу здесь только члены класса ServiceRecord, т.е. Id и Price
                }
            }


А я хочу, чтобы выходная последовательность была сгруппирована так же как и сейчас группируется, но только, чтобы она содержала все поля: Id, Name и Price.

Добавлено @ 11:09
Короче, решил так. Если можно покороче, то, пожалуйста, напишите как можно короче smile

Код

var result2 = from s in services
                          join op in operations                         
                          on s.Id equals op.Id                          
                          select new
                          {
                              Id = op.Id,
                              Name = op.Name,
                              Price = s.Price
                          }
                          into res
                          group res by res.Id
                          into groupedRes 
                          select new
                          {
                              Value = groupedRes,
                              CountOfSales = groupedRes.Count()
                          };
                          

            foreach (var item in result2)
            {
                foreach (var innerItem in item.Value)
                {
                    Console.WriteLine("Id:{0}, Name:{1}, CountOfSales:{2}, TotalSalesSumm:{3}", innerItem.Id, innerItem.Name, item.CountOfSales, item.CountOfSales*int.Parse(innerItem.Price));
                }
            }


Это сообщение отредактировал(а) ДобренькийПапаша - 23.6.2011, 11:20


--------------------
Меня зовут Себастьян Парейра, торговец чёрным деревом.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | LINQ (Language-Integrated Query) | Следующая тема »


 




[ Время генерации скрипта: 0.0403 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.