【问题标题】:Order by, distinct and select top 5 results with linq使用 linq 排序、区分并选择前 5 个结果
【发布时间】:2020-08-22 23:28:30
【问题描述】:

大家好,我正在尝试从数据库中选择 5 条不同的记录,但我需要有序且不同。我正在寻找最有效的方法。问题是 Distinct() 方法打乱了排序,所以我试图通过对它们进行分组来实现它,但似乎分组也打乱了排序。也许有人会有一个好的解决方案?

这是我目前的尝试。

public async Task<List<RecentProjectDto>> GetMostRecentProjects(int userId, int companyId)
    {
        using (var db = _dbFactory.Create())
        {


            var recentProjects = await db.ScheduleLogs
                .OfType<WorkLog>()
                .Where(x => x.UserId == userId)
                .Where(x => x.User.CompanyId == companyId)
                .OrderByDescending(x => x.End)
                .GroupBy(x => new { x.ProjectId, x.Project.Name, x.Project.Key, x.Project.Colour })
                .Select(x => new RecentProjectDto
                {
                   ProjectId = x.ProjectId,
                    ProjectName = x.Project.Name,
                    ProjectKey = x.Project.Key,
                    Colour = x.Project.Colour
                })
                .Take(5)
                .ToListAsync();
            return recentProjects;


        }
    }

【问题讨论】:

  • 我建议尝试将排序列添加到结果中,例如 .OrderByDesc(x =&gt; x.End).Distinct().Select(x =&gt; new{x.End, dto = new RecentProjectDto{....}}).Take(5).ToList() 并删除 GroupBy
  • 你的 .OrderByDescending 应该在 Groupby 之后
  • @Rahul group by 不包括排序列。
  • @GuruStron 是的,我按照 SQL 的执行顺序进行
  • @Sajid 好像涉及到db,所以代码转成SQL,不关心比较器。

标签: c# database performance linq service


【解决方案1】:

这样的东西有用吗?

var recentProjects = await db.ScheduleLogs
            .OfType<WorkLog>()
            .Where(x => x.UserId == userId)
            .Where(x => x.User.CompanyId == companyId)              
            .GroupBy(x => new { x.ProjectId, x.Project.Name, x.Project.Key, x.Project.Colour })
            .OrderByDescending(x => x.Max(a=>a.OrderDate))
            .Select(x => new RecentProjectDto
            {
                ProjectId   = x.Key.ProjectId,
                ProjectName = x.Key.Name,
                ProjectKey  = x.Key.Key,
                Colour      = x.Key.Colour
            })
            .Take(5)
            .ToListAsync();

【讨论】:

  • 奇怪。这可能会引发一些未显示的异常,或者需要很长时间,这可能意味着您正在使用一些 linq 提供程序,该提供程序正在内存中执行某些操作,因此从数据库中提取的数据比您想要的要多得多。您没有提及您使用的是哪种类型的数据库,但如果是 MSSQL,您可以尝试下载 Linqpad 并针对 Linq2Sql 和 EF 测试查询,它会显示生成的 sql。
  • 是的,我认为这很奇怪,但我认为我遇到了某种未记录的错误。我是开发数据库,​​它没有很多记录,是的,它是 MSSQL。
  • 好的,我使用的是 Jetbrains Rider,它不会给我任何错误,但切换到 VS 但在这种情况下这不会给我不同的记录(项目)。
  • 我不知道为什么它第一次不起作用,我可能从剪贴板粘贴了错误的东西,但它确实有效。谢谢!
猜你喜欢
  • 2012-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-06
  • 2019-10-11
  • 2017-04-09
相关资源
最近更新 更多