Если я хочу применить предикат к документу перед агрегацией в функции Reduce, хочу ли я разместить этот предикат в функции Map или в функции Reduce?
Так, например, помещение предиката в функцию Map будет выглядеть так:
Map = orders => orders
.Where(order => order.Status != OrderStatus.Cancelled)
.Select(order => new
{
Name = order.Firstname + ' ' + order.Lastname,
TotalSpent = order.Total,
NumberOfOrders = 1
});
Reduce = results => results
.GroupBy(result => result.Email)
.Select(customer => new
{
Name = customer.Select(c => c.Name).FirstOrDefault(),
TotalSpent = customer.Sum(c => c.TotalSpent),
NumberOfOrders = customer.Sum(c => c.NumberOfOrders)
});
И помещение его в функцию Reduce будет выглядеть так:
Map = orders => orders
.Select(order => new
{
Name = order.Firstname + ' ' + order.Lastname,
TotalSpent = order.Total,
NumberOfOrders = 1,
Status = order.Status
});
Reduce = results => results
.Where(order => order.Status != OrderStatus.Cancelled)
.GroupBy(result => result.Email)
.Select(customer => new
{
Name = customer.Select(c => c.Name).FirstOrDefault(),
TotalSpent = customer.Sum(c => c.TotalSpent),
NumberOfOrders = customer.Sum(c => c.NumberOfOrders),
Status = (OrderStatus)0
});
Последнее, очевидно, имеет больше смысла, однако это означает, что мне нужно добавить свойство Status к классу результата Reduce, а затем просто установить его на какое-то неизвестное значение в Reduce, поскольку это на самом деле ничего не значит.