LinQ группа запросов дважды в одну и ту же таблицу - PullRequest
1 голос
/ 12 февраля 2020

Мне нужна помощь.
Проблема : у меня есть 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);

1 Ответ

1 голос
/ 12 февраля 2020

может быть что-то подобное

from user in companyUsers

join mt in Context.MedalTransactions
on user.Id equals mt.Destination into destinations

join mt2 in Context.MedalTransactions
on user.Id equals mt2.Origin into origins

from mtd in mt.DefaultIfEmpty()
from mto in mt2.DefaultIfEmpty()

group new { user, mtd, mto } by new { user.Id } into medals
select new {user.Id, user.Name, ..., 
    TotalAcquiredMedals = mtd.Where(_ => _ != null).Distinct().Count(), 
    TotalAssignedMedals = mto.Where(_ => _ != null).Distinct().Count()
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...