Linq分组按2键作为一个

时间:2010-04-01 18:07:01

标签: linq linq-to-entities grouping

我为我的网站编写了一个简单的OLAP查看器。这是类(抽象示例):

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

员工可以同时成为订单中的经理和执行人员。这意味着Employee角色不是固定的。 我必须按员工对订单进行分组,最后使用Employee密钥进行IGrouping。

因此不允许.GroupBy(el => new {el.Manager,el.Executive})。

我考虑了IEqualityComparable的一些技巧,但没有找到解决方案。

如果somrbody会帮助我,我会很高兴,谢谢。

2 个答案:

答案 0 :(得分:0)

这是一个解决方案,假设您已实现/覆盖了gethashcode和equals

       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();
        }

答案 1 :(得分:0)

为了简化Viewer的架构,我制作了转换功能,为分析准备数据。我稍后会进行分组。这会产生副作用:订单的总和和数量会发生变化,因为我们会生成一些新订单。但在我的情况下,这是最好的解决方案,因为架构。如果我在DB服务器上遇到麻烦,我会在此操作之前调用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;
        }