Перевести sql в метод расширения linq, внутреннее соединение с группой выбора

Добрый день,

Спасибо за ваше время.

Я хочу получать последние сообщения таблицы чата по userId и projectId, и это работает нормально

 select * from chatTable inner join 
 (select max(SendDate) maxtime,[ProjectId]   from [chatTable]       
group by [ProjectId])latest
on latest.maxtime=chatTable.SendDate and
latest.[ProjectId]=chatTable.[ProjectId]
order by SendDate

Как видите, я получаю последние сообщения из chatTable с присоединением, которое приносит последний идентификатор проекта и последнее сообщение.

Как я могу получить linq с методами расширения?

var messages= await _dbContext.chatTable.....

Спасибо

Пожалуйста, поделитесь, какие попытки linq вы пробовали. Есть много вопросов и ресурсов linq, которые помогут с этим. Мы можем помочь исправить ваши попытки

Gilad Green 05.07.2019 10:07

сказать по правде, я действительно застрял здесь....

ev vk 05.07.2019 10:13

Итак, вы хотите получить каждый ProjectId с его максимальным SendDate в виде списка, упорядоченного по SendDate? Я не понимаю, почему вам нужно использовать inner join здесь.

Ammar 05.07.2019 10:25

Мне нужно получить все сообщения из чата за столом (видите ли, например, в WhatsApp вы просто видите предварительный просмотр последнего сообщения в чате). внутреннее соединение для фильтрации

ev vk 05.07.2019 10:35

@evvk, если мой ответ вам подойдет. Пожалуйста, примите это.

sri harsha 05.07.2019 12:03
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
5
48
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

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

var latest= _dbContext.chatTable.GroupBy(x=>x.ProjectId).Select(x=>new {maxTime=x.Max(y=>y.SendDate), ProjectId=x.Key });
var res=(from ct in _dbContext.ChatTable 
join la in latest on la.maxTime equals ct.SendDate and la.ProjectId equals ct.ProjectId).ToList().OrderBy(x=>x.SendDate);
Ответ принят как подходящий

Что ж, ребята, похоже, у linq entity framework есть свои преимущества. этот запрос лучше и получает последнее сообщение, отправленное в последний проект

    var ultimos = await _dbContext.chatTable .GroupBy(item => item.ProjectId)
     .Select(group => new { pId= group.Key, latestMessage= group.OrderByDescending(r=>r.SendDate)
    .FirstOrDefault() })
     .ToListAsync();

и все сообщения находятся внутри объекта

Этот запрос должен делать то, что вы хотите

_dbContext.ChatTable
    .GroupBy(c => c.ProjectId)
    .Select(g => g
        .OrderByDescending(c => c.SendDate)
        .First())
    .OrderBy(c => c.SendDate);

Это должно дать то, что вам нужно:

_dbContext.chatTable
  .GroupBy(c => c.ProjectId)
  .Select(g => g.OrderBy(c => c.SendDate).LastOrDefault())

Другие вопросы по теме