以2个键作为一个键进行Linq分组

以2个键作为一个键进行Linq分组,linq,linq-to-entities,grouping,Linq,Linq To Entities,Grouping,我为我的网站编写了一个简单的OLAP查看器。以下是类(抽象示例): 员工可以同时是订单中的经理和执行官。这意味着员工角色不是固定的。 我必须按员工对订单进行分组,最后使用员工密钥进行I分组 因此,不允许使用.GroupBy(el=>new{el.Manager,el.Executive}) 我考虑了一些IEQualityCompable的技巧,但没有找到解决方案 如果somrbody能帮上忙,我会很高兴的,谢谢你。这里有一个解决方案,假设你已经实现/覆盖了gethashcode和equals

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

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

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

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


如果somrbody能帮上忙,我会很高兴的,谢谢你。

这里有一个解决方案,假设你已经实现/覆盖了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();
        }
var a=(
按顺序从o开始
选择新的{
顺序=o,
雇员=副经理
}
);
变量b=(
按顺序从o开始
选择新的{
顺序=o,
雇员=高级管理人员
}
);
var final=(a.Union(b)).Distinct().GroupBy(x=>x.Empoyee.ID,x=>x.Order);
foreach(最终将o分组)
{
o、 托利斯特();
}

为了简化查看器的体系结构,我创建了transform函数,它为分析准备数据。稍后我将执行分组。这会产生副作用:订单的总数和数量会发生变化,因为我们会生成一些新订单。但在我的情况下,这是最好的解决方案,因为架构。如果DB Server出现问题,我将在执行此操作之前调用ToList。我认为我的应用程序允许这种风格。再谢谢你一次!:)

public IQueryable TransForDim(IQueryable E)
{
如果(本尺寸类型==Сзззззззззззззззз
{
if(E.ElementType==typeof(ааз)
{
var订单=E为可计量;
变量a=(
按顺序从o开始
选择新的
{
顺序=o,
雇员=o.Мжж
}
);
变量b=(
按顺序从o开始
选择新的
{
顺序=o,
Empoyee=o.аСааааааааа
}
);
var final=(a.Union(b)).Distinct().选择(e=>新的)
{
Мжжжö=e.雇员,
ааааааа=e.订单。ааааааа,
b.订单,
Бааааааааааа=e.订单,
аааааааПаааПааааааааа,
κцццц=e.Order.κццццц,
МММцццц=e.订单,
ааа=e.订单аааааа
});
返回最终结果;
}
其他的
{
抛出新的ArgumentOutOfRangeException(“参数”);
}
}
否则返回E;
}

哇,在任何人能够帮助你之前,你需要清理一下。请定义value=IEnumerable是什么,以及您试图如何对数据进行分组,您是否试图按员工对订单进行分组(忽略经理/主管)?好的,我已经清理好了。是的,我正在“尝试按员工分组订单(忽略经理/主管)”。这很酷。我认为实体框架提供者可以将其转换为sql,分组将由DB server执行。但是1)我的OLAP查看器在创建匿名类型方面有一些限制。因为我对同一组对象有很多依赖关系。此外,为了简单起见,接口必须尽可能简单(此转换添加了功能)。2) 我使用动态linq库。我需要用它来测试这个解决方案。因此,稍后我将在我的查看器中尝试此解决方案。非常感谢。将此项下推到数据库时可能会遇到一些问题。让我看看我是否能想出一个与您想要的sql等价的东西。你的EF模型是什么样子的?
       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();
        }
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;
        }