Мне нужна помощь.
Проблема : у меня есть User
и класс MedalTransaction
. Пользователь может назначать медали и получать их. MedalTransaction
имеет 2 свойства с именами Origin
и Destination
, которые являются идентификаторами пользователя.
Что я пробовал:
var q = (from user in companyUsers
join mt in Context.MedalTransactions
on user.Id equals mt.Destination into medalTransactions
from mt in medalTransactions.DefaultIfEmpty()
group new { user, mt } by new { mt.Destination } into receivedMedals
select new User
{
Id = receivedMedals.Select(u => u.user.Id).FirstOrDefault(),
Name = receivedMedals.Select(u => u.user.Name).FirstOrDefault(),
Company = receivedMedals.Select(u => u.user.Company).FirstOrDefault(),
TotalAcquiredMedals = receivedMedals
.Where(m => m.mt.Destination == m.user.Id && m.mt.Origin != systemId)
.Sum(m => m.mt.Quantity)
})
.OrderByDescending(u => u.TotalAcquiredMedals);
Это работает, , но только для полученных медалей . Я хотел установить другое свойство TotalAssignedMedals
при создании пользовательского экземпляра. Я пробовал несколько group by
, но так и не получил желаемых результатов, даже не знаю, возможно ли это сделать.
Спасибо за помощь
РЕДАКТИРОВАТЬ Вопрос решен, окончательный код:
var q = (from user in companyUsers
join mt in Context.MedalTransactions
on user.Id equals mt.Destination into receivedMedals
join mt2 in Context.MedalTransactions
on user.Id equals mt2.Origin into assignedMedals
from mtReceived in receivedMedals.DefaultIfEmpty()
from mtAssigned in assignedMedals.DefaultIfEmpty()
group new { user, mtReceived, mtAssigned } by new { user.Id } into medalTransactions
select new User
{
Id = medalTransactions.Select(_ => _.user.Id).FirstOrDefault(),
Name = medalTransactions.Select(_ => _.user.Name).FirstOrDefault(),
Company = medalTransactions.Select(_ => _.user.Company).FirstOrDefault(),
TotalAcquiredMedals = medalTransactions
.DistinctBy(m => m.mtReceived.Id)
.Where(m => m.mtReceived.Origin != systemId)
.Sum(m => m.mtReceived.Quantity),
TotalAssignedMedals = medalTransactions
.DistinctBy(m => m.mtAssigned.Id)
.Where(m => m.mtAssigned.Destination != systemId)
.Sum(m => m.mtAssigned.Quantity)
})
.OrderByDescending(u => u.TotalAcquiredMedals);