Если у вас есть операция агрегирования, которая не является одной из встроенных (Sum
, Max
и т. Д.), Вы должны обратиться к Aggregate
, что является более подробным, но и гораздо более мощный. Здесь вы хотите
var data = TestData();
var grouped =
from permList in data
group permList by new { permList.UserId, permList.ModuleId } into g
select new { // or a named class if you have one
g.Key.UserId,
g.Key.ModuleId,
BitMaskedPermission
= g.Aggregate(0, (acc, curr) => acc | curr.BitMaskedPermission)
};
Здесь мы передаем Aggregate
функцию, которая принимает аккумулятор acc
и текущее значение curr
, и побитовое ИЛИ для получения текущего значения аккумулятора.
Если вы предпочитаете синтаксис цепочки методов, он будет выглядеть (любезно предоставлено @ Chris ):
var grouped = PermList.TestData()
.GroupBy(x=> new{x.UserId, x.ModuleId})
.Select(x=> new {
x.Key.UserId,
x.Key.ModuleId,
mask = x.Aggregate(0, (acc, curr)=>acc|curr.BitMaskedPermission)}
)