2010-04-01 2 views
0

Я пишу простой просмотрщик OLAP для своего сайта. Вот классы (абстрактный пример):Linq Группирование по 2 ключам как одному

Employee 
{ 
     ID; 
     Name; 
     Roles[]; //What Employee can do 
} 
Order 
{ 
    Price; 
    Employee Manager; 
    Employee Executive; //Maybe wrong english. The person which perform order   
} 

Сотрудник может быть одновременно менеджером и исполнительным директором. Это означает, что роль Employee не фиксирована. Мне нужно сгруппировать заказы сотрудников и, наконец, получить IGrouping с ключом Employee.

Так что .GroupBy (el => new {el.Manager, el.Executive}) не допускается.

Я рассмотрел некоторые трюки с IEqualityComparable, но не нашел решения.

Если кто-то поможет, я буду рад радоваться, спасибо.

+0

ничего себе, вам нужно очистить это, прежде чем кто-нибудь сможет вам помочь. Определите, какое значение = IEnumerable, и как вы пытаетесь группировать свои данные, пытаетесь ли вы просто группировать заказы со стороны сотрудника (игнорируя менеджера/исполнительного директора)? – Nix

+0

Хорошо, я почистил. Да, я пытаюсь просто группировать заказы со стороны сотрудника (игнорируя менеджера/исполнительного директора) ». – Evgeny

ответ

0

Вот решение, с предположением, вы реализовали/переопределено GetHashCode и равен

 var a = (
      from o in orders 
      select new { 
       Order = o, 
       Empoyee = o.Manager 
      } 
      ); 


     var b = (
      from o in orders 
      select new { 
       Order = o, 
       Empoyee = o.Executive 
      } 
      ); 

     var final = (a.Union(b)).Distinct().GroupBy(x=>x.Empoyee.ID, x=>x.Order); 

     foreach (IGrouping<int, Order> o in final) 
     { 
      o.ToList(); 
     } 
+0

Правильно круто. Я думаю, что поставщик инфраструктуры сущности может перевести это на sql, и группировка будет выполняться сервером БД. Но 1) Мой просмотрщик OLAP имеет некоторые ограничения на создание анонимных типов. Потому что у меня много зависимостей с одним и тем же набором объектов. Также для простоты интерфейсы должны быть максимально простыми (это преобразование добавляет функциональность). 2) Я использую динамический linq lib. Я не тестировал решение с ним. Итак, немного позже я попробую это решение с помощью моего средства просмотра. Большое спасибо. – Evgeny

+0

у вас могут возникнуть проблемы с нажатием на эту базу данных. позвольте мне посмотреть, могу ли я придумать sql-эквивалент того, что вы хотите. Как выглядит ваша модель EF? – Nix

0

Чтобы упростить архитектуру просмотра, я сделал преобразование функции, которые подготавливают данные для анализа. Я буду выполнять группировку позже. Это делает побочный эффект: сумма и количество заказов меняются, потому что мы производим несколько новых заказов. Но в моем случае это лучшее решение из-за архитектуры. Если у меня возникнут проблемы с сервером БД, я вызову ToList перед этой операцией. Я думаю, что этот стиль разрешен моим приложением. Спасибо еще раз! :)

public IQueryable TransForDim(IQueryable E) 
     { 
      if (this._DimType == Измерения.Сотрудники) 
      { 
       if (E.ElementType == typeof(Заказ)) 
       { 
        var Orders = E as IQueryable<Заказ>; 
        var a = (
        from o in Orders 
        select new 
        { 
         Order = o, 
         Empoyee = o.Менеджер 
        } 
        ); 

        var b = (
         from o in Orders 
         select new 
         { 
          Order = o, 
          Empoyee = o.Исполнитель 
         } 
         ); 

        var final = (a.Union(b)).Distinct().Select(e => new Заказ() 
        { 
         Менеджер = e.Empoyee, 
         Валюта = e.Order.Валюта, 
         Выполнено = e.Order.Выполнено, 
         Дата_Выполнения = e.Order.Дата_Выполнения, 
         Дата_Поступления = e.Order.Дата_Поступления, 
         Клиент = e.Order.Клиент, 
         Отменен = e.Order.Отменен, 
         Цена = e.Order.Цена 
        }); 
        return final; 
       } 
       else 
       { 
        throw new ArgumentOutOfRangeException("Измерение не обрабатывает данные кроме заказов"); 
       } 
      } 
      else return E; 
     } 
Смежные вопросы