Хобрук: Ваш путь к мастерству в программировании

Linq Lambda: обновление последнего пользователя группой одного и того же пользователя с использованием группы и подсчета?

Я хочу обновить последнего пользователя с помощью лямбда-выражения linq, используя группу и количество оставшихся пользователей. Я не знаю, как я могу это сделать.

вот мои данные:

userid | name | datetime            | isdelete
1      | abc  | 16-03-2017 15:45:59 | 0
1      | abc  | 16-03-2017 12:45:10 | 0 
2      | xyz  | 16-03-2017 15:45:59 | 0
1      | abc  | 16-03-2017 10:40:59 | 0

Я хочу, чтобы результат выглядел так:

userid | name | datetime            | count 
1      | abc  | 16-03-2017 15:45:59 |   3   
2      | xyz  | 16-03-2017 15:45:59 |   1  

Здесь count для userid = 1 должно быть 3, так как в таблице есть три записи для этого идентификатора.

Я написал этот запрос, но он получает все записи.

List<Users> UList = new List<Users>();
UList  = db.Users.Where(a => a.isdelete == false)
    .OrderByDescending(a => a.datetime)
    .Skip(skip)
    .Take(pageSize)
    .ToList();

Кто-нибудь знает, как я могу получить данные, которые я хочу? Пожалуйста, дайте мне знать, используя лямбда-выражение linq.

17.03.2017

  • Если вы хотите вернуть пользователей, нет способа вернуть количество, предполагая, что User не имеет свойства Count. Вам нужно вернуть DTO. 17.03.2017

Ответы:


1

Вам нужно сгруппировать по пользователю, чем сортировать каждую группу и брать сначала из каждой группы

var UList = (db.Users
                      .Where(a => a.isdelete == false)
                      .GroupBy(a => a.UserId)
                      .Select(g => new MyNewClass
                                   {
                                     Count = g.Count(), 
                                     User =  g.OrderByDescending(a => a.datetime).First()
                                   }
                      ))
                       .Skip(skip)
                       .Take(pageSize)
                       .ToList();
17.03.2017
  • я думаю ему тоже нужен счет 17.03.2017
  • привет, я также добавляю это в последний .Skip(skip).Take(pageSize).ToList(); затем получаю ошибку после select(). 17.03.2017
  • это не работает, даже если я просто добавляю tolist() после того, как select() получает ошибку. 17.03.2017
  • @Hiren, отредактированный ответ, проверьте, если не отправить сообщение об ошибке? 17.03.2017
  • Подобное выражение system.Argumentnullexpression не может неявно преобразовывать тип 'system.collections.generic.list анонимный тип#1' в 'system.collections.generic.list‹Users› 17.03.2017
  • может ли одно из этих полей быть нулевым? идентификатор пользователя, удаление, дата и время, пропуск, размер страницы? 17.03.2017
  • ааа, верно, извините за мою ошибку, 1 секунда исправит... результат этого запроса не является списком пользователей, если вы хотите преобразовать его в список пользователей, используйте другой выбор... var будет работать 17.03.2017
  • не могли бы вы отредактировать свой ответ, если возможно, то, пожалуйста. 17.03.2017
  • Давайте продолжим обсуждение в чате. 17.03.2017
  • предположим, я не использую var, а любую другую волну, на самом деле у меня есть много условий для переменной списка UList. 17.03.2017
  • привет @Arsen Mkrtchyan не могли бы вы мне помочь? 12.04.2017
  • по какому вопросу? 12.04.2017

  • 2

    Вы забыли сгруппировать данные:

    var result = db.Users.Where(a => !a.isdelete)
        .GroupBy(x => x.userid)
        .Select(x => new User 
            { 
                userid = x.Key, 
                name = x.Last().Name, 
                datetime = x.OrderByDescending(a => a.datetime).First().datetime, 
                count = x.Count() 
            });
    

    РЕДАКТИРОВАТЬ: Это может быть не оптимальным, учитывая производительность, поскольку вызов Last и OrderByAscending будет выполнять итерацию всех данных. Чтобы немного преодолеть это, вы можете немного изменить структуру этого запроса:

    var result = db.Users.Where(a => !a.isdelete)
        .GroupBy(x => x.userid)
        .Select(x => new 
            { 
                user = x.OrderByDescending(a => a.datetime).First(), 
                count = x.Count() 
            })
        .Select(x => new User {
            name = x.user.name,
            userid = x.user.userid,
            datetime = x.user.datetime,
            count = x.count
        });
    
    17.03.2017
  • интересно, как генерируется SQL, если мы меняем x.Last() на x.First() 17.03.2017
  • Разве Linq2Sql не знает Last? Я не уверен. В любом случае мы могли бы использовать и First. 17.03.2017
  • Я верю, что он знает... Интересно, сделает ли он два внутренних запроса, чтобы получить имя и дату и время... 17.03.2017
  • @ArsenMkrtchyan Я добавил подход, который использует на одну итерацию меньше. 17.03.2017
  • Новые материалы

    Основы принципов S.O.L.I.D, Javascript, Git и NoSQL
    каковы принципы S.O.L.I.D? Принципы SOLID призваны помочь разработчикам создавать надежные, удобные в сопровождении приложения. мы видим пять ключевых принципов. Принципы SOLID были разработаны..

    Как настроить Selenium в проекте Angular
    Угловой | Селен Как настроить Selenium в проекте Angular Держите свое приложение Angular и тесты Selenium в одной рабочей области и запускайте их с помощью Mocha. В этой статье мы..

    Аргументы прогрессивного улучшения почти всегда упускают суть
    В наши дни в кругах веб-разработчиков много болтают о Progressive Enhancement — PE, но на самом деле почти все аргументы с обеих сторон упускают самую фундаментальную причину, по которой PE..

    Введение в Джанго Фреймворк
    Схема «работать умно, а не усердно» В этой и последующих статьях я познакомлю вас с тем, что такое фреймворк Django и как создать свое первое приложение с помощью простых и понятных шагов, а..

    Настольный ПК как «одно кольцо, чтобы править всеми» домашних компьютеров
    Вид после 9 месяцев использования С настольных компьютеров все началось, но в какой-то момент они стали «серверами», и мы все перешли на ноутбуки. В прошлом году я столкнулся с идеей настольных..

    Расширенные методы безопасности для VueJS: реализация аутентификации без пароля
    Руководство, которое поможет вам создавать безопасные приложения в долгосрочной перспективе Безопасность приложений часто упускается из виду в процессе разработки, потому что основная..

    стройный-i18следующий
    Представляем стройную оболочку для i18next. Эта библиотека, основанная на i18next, заключает экземпляр i18next в хранилище svelte и отслеживает события i18next, такие как languageChanged,..