c# - 优化 linq 查询以对行进行排序?

标签 c# sql linq lambda entity-framework-6

我使用以下查询从数据库“媒体”表中获取值。现在我必须按其父 ID 对行进行排序意味着首先我必须显示父 ID 行,然后在其下显示其子行,例如下表:

ID   Name   ParentMediaId
3     C           null
1     A            3
4     D           null
2     B            4

如何使用下面的数据表得到如上表的结果,并用lambda表达式修改下面的linq查询?

数据库中的媒体表:

ID      Name     ParentMediaId
1        A            3
2        B            4
3        C           null
4        D           null 

查询获取数据:

var dataset = _mediaRepository.GetAll().
                   Where(d => d.matter== matterId).Select(d => new
                   {
                       d.Id,
                       d.Name,
                       d.ParentMediaId,
                   }).ToList();

最佳答案

如果值不是null,您可以通过ParentMediaIdOrderBy;否则 Id,然后通过 ParentMediaId 使用 ThenBy 进行排序,使 parent 先出现。

对于 OrderBy,您可以使用 null-coalescing operator (??)。如果操作数不是null,它返回左边的操作数;否则返回右边的操作数。

var objects = _mediaRepository.GetAll()
                   .Where(d => d.matter== matterId)
                   .Select(d => new
                    {
                        d.Id,
                        d.Name,
                        d.ParentMediaId,
                    });

var dataset = objects.OrderBy(o => o.ParentMediaId ?? o.Id)
                     .ThenBy(o => o.ParentMediaId)
                     .ToList();

如果 child 先出现,则使用 ThenByDescending 而不是 ThenBy

元素的顺序如下:

ID   Name   ParentMediaId
3     C           null
1     A            3
4     D           null
2     B            4

关于c# - 优化 linq 查询以对行进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38014824/

相关文章:

c# - Winforms异步加载大数据?

sql - 此 sql 的 Rails 事件记录转换

MySQL 不返回具有 Left Join 和 Group By 的 0 聚合行

asp.net-mvc - Linq/Entity Group 然后计算这些组

c# - 在不指定参数的情况下使用强类型方法作为参数

c# - 为什么 "root\\StandardCimv2"在 Windows 7 中不起作用?

c# - 属性路由和 CreatedAtRoute

c# - 如何使用 Func<T, bool> 作为 Func<object, bool> 的参数?

python - 使用 Python 将文本文件写入 SQL

c# - 如果字典的键存在于 string[] 中,如何使用 linq 过滤字典值