Как сгруппировать по заданным c атрибутам и заказать по другому? - PullRequest
1 голос
/ 09 апреля 2020

Я хочу сделать запрос, который получит разные пары postGroup и ApplicationUserId, которые являются атрибутами таблицы Post. Я также хочу упорядочить выбранные посты по их PostDate, что также является атрибутом в этой таблице, и я использую условие where для выбора только постов пользователей или сайтов, за которыми я следил, или моих.

Я не могу этого добиться, но я попробовал вот что:

 var posts = (from m in context.Posts
                     orderby m.PostDate descending
                     where ((context.FollowedUsers
        .FirstOrDefault(n => n.FollowerId == Id && n.ApplicationUserId == m.ApplicationUserId)) != null
        || (context.FollowedSites.FirstOrDefault(n => n.ApplicationUserId == Id && n.SiteId == m.SiteId) != null)
        || m.ApplicationUserId == Id)
                     group m by new { m.PostGroup, m.ApplicationUserId } into g
                     select new { g.Key.ApplicationUserId, g.Key.PostGroup } ).Skip(skip).Take(nOfPosts).ToList();

Это позволит генерировать отдельные пары без упорядочивания.

Любая помощь приветствуется!

Ответы [ 2 ]

1 голос
/ 09 апреля 2020

Группировка снимает порядок. Каждая группа может содержать любое значение PostDate, и в этот момент невозможно определить, к какой дате следует упорядочить группы.

Вы должны переместить порядок следования за группой:

var posts = (from m in context.Posts
             where context.FollowedUsers.Any(n => n.FollowerId == Id && n.ApplicationUserId == m.ApplicationUserId)
                || context.FollowedSites.Any(n => n.ApplicationUserId == Id && n.SiteId == m.SiteId)
                || m.ApplicationUserId == Id
            group m by new { m.PostGroup, m.ApplicationUserId } into g
            orderby g.Max(m => m.PostDate) descending
            select new 
            {
                g.Key.ApplicationUserId, 
                g.Key.PostGroup 
            }).Skip(skip).Take(nOfPosts).ToList();

Примечание: я также изменил некоторые предикаты в Any.

0 голосов
/ 09 апреля 2020

Хмм .. Я не уверен, чего ты хочешь достичь. Ваш запрос выглядит нормально. Вы уверены, что результат неправильный? После упорядочения по PostDate результат выглядит, например, как

Data        UserId      PostGroup
----------- ----------- -----------
3           10          1
2           20          2
2           10          2
1           20          2

После группировки по UserId и PostGroup результат должен выглядеть следующим образом:

UserId      PostGroup
----------- -----------
10          1
20          2
10          2

И ваш запрос дает такой результат. Я переписываю ваш запрос, вы можете проверить результат следующим образом:

var posts = context.Posts.OrderByDescending(p => p.PostDate)
    .Where(m => context.FollowedUsers.FirstOrDefault(n => n.FollowerId == Id && n.ApplicationUserId == m.ApplicationUserId)) != null || (context.FollowedSites.FirstOrDefault(n => n.ApplicationUserId == Id && n.SiteId == m.SiteId) != null) || m.ApplicationUserId == Id)
    .GroupBy(group => new { group.PostGroup, group.ApplicationUserId })
    .Select(x => new { x.Key.ApplicationUserId, x.Key.PostGroup })
    .Skip(skip).Take(nOfPosts).ToList();
...