Linq Группировка по 2 клавишам как одна - PullRequest
0 голосов
/ 01 апреля 2010

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

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

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

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

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

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

Ответы [ 2 ]

0 голосов
/ 02 апреля 2010

Чтобы упростить архитектуру Viewer, я сделал функцию преобразования, которая подготавливает данные для анализа.Я выполню группировку позже.Это создает побочный эффект: изменяется сумма и количество заказов, потому что мы производим несколько новых заказов.Но в моем случае это лучшее решение из-за архитектуры.Если у меня возникнут проблемы с сервером БД, я вызову 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;
        }
0 голосов
/ 01 апреля 2010

Вот решение с допущением, что вы реализовали / переопределили 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();
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...