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