Linq Multiple Orderby Query в одном листинге с несколькими условиями - PullRequest
0 голосов
/ 29 мая 2019
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));

Это то, что я использую для сортировки списка моих проектов по названию проекта, и все идет хорошо. Теперь я хочу изменить порядок в соответствии с условиями, как показано ниже.

  1. Сначала нужно показать все проекты, которые содержат TaskPriority, как «срочные» В любой из задач (у каждого проекта есть список задач).
  2. остальные все проекты хотят показать в порядке возрастания.
  3. Если любое имя проекта, начинающееся с цифры, должно быть последним.

Я попробовал код

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

1 Ответ

1 голос
/ 29 мая 2019

Надеюсь, я правильно понял ваш вопрос. Причина, по которой ваш запрос не сработал, заключалась в том, что при заказе логических значений сначала указывается значение 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);

Пример вывода

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...