【问题标题】:How to get dictinct userid with order by close using Linq如何使用 Linq 通过 order by 子句获取不同的用户 ID
【发布时间】:2021-06-08 13:25:04
【问题描述】:

我有一个名为 info 的表,它的数据是这样的:

FKUserID CompletedTime Type
1 2021-03-10 12:56:00.423 5
245 2021-03-10 12:46:46.977 5
1 2021-03-10 12:44:53.683 5
1 2021-03-10 12:40:54.733 5
1 2021-03-10 12:35:26.307 5
245 2021-03-10 11:11:33.887 5
245 2021-03-10 10:18:11.403 5

我需要获取不同的用户 ID 数据,以及他们CompletedTime 列的最大完成时间

预期输出是:

FKUserID CompletedTime Type
1 2021-03-10 12:56:00.423 5
245 2021-03-10 12:46:46.977 5

我需要使用Linq 查询来执行此操作 我该怎么做呢,我用 SQl 做的,需要用 Linq 做的

SELECT FKUserID , MAX(CompletedTime) 
from Info 
where cast(CompletedTime as date) = '2021-03-10' 
and Status = 5 
GROUP BY FKUserID;

【问题讨论】:

标签: c# sql linq


【解决方案1】:

类似的东西

var d = new DateTime(2021, 3, 10);
var d2 = d.AddDays(1);

dbContext.Infos
  .Where(i => i.Status == 5 && i.CompletedTime >= d && i.CompletedTime < d2)
  .GroupBy(i => i.FkUserId)
  .Select(g => new { 
    FkUserId = g.Key, 
    CompletedTime = g.Max(g2 => g2.CompletedTime)
  } 
);

【讨论】:

  • 我可以在哪里添加 status = 5 逻辑
【解决方案2】:

您可以使用以下查询。以下查询实现了您的 SQL 查询。

var query = context.Info.GroupBy(a => a.FKUserID)
     .Join(context.Info,
      left => left.Key,
      right => right.FKUserID,
      (left, right) => new { left, right })
      .Where(a => a.right.CompletedTime.ToShortDateString() == "2021-03-10" && a.right.Status == 5)
      .Select(a => new
      {
         FKUserID = a.left.Key,
         CompletedTime = a.left.Max(x => x.CompletedTime)
      }).ToList();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-27
    相关资源
    最近更新 更多