具有多个条件的一个列表中的 Linq 多个 Orderby 查询

Linq Multiple Orderby Query in one Listing with multiple conditions

var result = await projectRepo.GetPagedListAsync(x => new ProjectApiModel
            {
                ProjectId = x.Id,
                ProjectKey = x.ProjectKey,
                ProjectName = x.ProjectName,
                ProjectStatus = x.ProjectStatus,
                Tasks = x.Tasks.Where(z => /*z.AgentId == referenceId &&*/ z.Status == true && (z.TaskStatus == null || z.TaskStatus.StatusName != "Closed")).Select(y => new TaskApiModel
                {
                    TaskId = y.Id,
                    TaskName = y.TaskName,
                    ProjectId = y.ProjectId,
                    TaskTypeName = y.TaskType.TypeName,
                    TaskPriority = y.TaskPriorityId == null ? null : new PriorityModel { Name = y.TaskPriority.Name, Color = y.TaskPriority.Color, Id = y.TaskPriority.Id, Scale = y.TaskPriority.Scale },
                    TaskStatus = y.TaskStatusId == null ? null : new StatusModel { StatusName = y.TaskStatus.StatusName, Color = y.TaskStatus.Color, Scale = y.TaskStatus.Scale, StatusId = y.TaskStatus.Id, Status = y.TaskStatus.Status },
                    Deadline=y.EndDateUTC
                }).ToList()
            },orderBy: orders => orders.OrderBy(o => o.ProjectName));

这就是我用项目名称对我的项目列表进行排序的方法,并且进展顺利。现在我想按条件更改 orderby,如下所示。

  1. 首先要显示所有包含 TaskPriority 的项目 "urgent" 在任何一个任务中(每个项目都有任务列表)。
  2. 其余所有项目都希望显示升序。
  3. 如果任何以数字开头的项目名称应该在最后。

我尝试了代码

orderBy: orders => orders.OrderBy(o => o.Tasks.Any(s=>s.TaskPriority.Name.ToLower()== "urgent")).ThenBy(i=>i.ProjectName));

希望我正确理解了你的问题。您的查询不起作用的原因是在订购布尔值时,首先订购 False。

你需要做的是在第一个条件中按降序排列。

orders.OrderByDescending(o => o.Tasks.Any(s=>s.TaskPriority.Name.ToLower()== "urgent"))
       .ThenBy(i=>i.ProjectName));

例如,使用更简单的 类

模拟场景
public class Project
{
    public long ProjectId{get;set;}
    public string ProjectName{get;set;}
    public IEnumerable<ProjectTask> Task{get;set;}
}

public class ProjectTask
{
    public long TaskId{get;set;}
    public string TaskPriority{get;set;}
}

客户代码

var project1 = new Project
{
    ProjectId=1,
    ProjectName = "abc",
    Task = new []
    {
        new ProjectTask{TaskId=1,TaskPriority="urgent"},
        new ProjectTask{TaskId=1,TaskPriority="moderate"},
    }
};

var project2 = new Project
{
    ProjectId=2,
    ProjectName = "aaa",
    Task = new []
    {
        new ProjectTask{TaskId=1,TaskPriority="moderate"},
        new ProjectTask{TaskId=1,TaskPriority="moderate"},
    }
};


var project3 = new Project
{
    ProjectId=2,
    ProjectName = "abb",
    Task = Enumerable.Empty<ProjectTask>()
};

var project4 = new Project
{
    ProjectId=2,
    ProjectName = "abaa",
    Task = new []
    {
        new ProjectTask{TaskId=1,TaskPriority="moderate"},
        new ProjectTask{TaskId=1,TaskPriority="moderate"},
    }
};

var listOfProjects = new [] {project1,project2,project3,project4};

var r = listOfProjects.OrderByDescending(o => o.Task.Any(s=>s.TaskPriority.ToLower()== "urgent"))
                      .ThenBy(i=>i.ProjectName);

示例输出