将sql转换为linq扩展方法内部联接,并选择group by

时间:2019-07-05 08:05:24

标签: c# entity-framework 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中获取最新消息,并带有一个带最新项目ID和最新消息的联接。

如何使用扩展方法使用linq?

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

谢谢

4 个答案:

答案 0 :(得分:1)

您可以先查询内部内容,如下所示:

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);

答案 1 :(得分:0)

好吧,看来linq实体框架有其优势 此查询更好,并且可以将最新消息发送到最新项目

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

,所有消息都在实体内部

答案 2 :(得分:0)

此查询应执行您想要的

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

答案 3 :(得分:0)

这应该可以满足您的需求:

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