我为我的网站编写了一个简单的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会帮助我,我会很高兴,谢谢。
答案 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;
}