Это кажется трудным требованием для решения с использованием какой-либо конкретной платформы ORM, по крайней мере, не одним простым шагом.Вероятно, потребуется многоэтапный процесс.
Нечто похожее может быть достигнуто с помощью подхода для итерации результатов поиска и поиска их дочерних элементов (и дочерних элементов) и объединения иерархии в единый список.,Вот пример реализации, выполненный с использованием простого списка в памяти:
class Employee
{
public int Id { get; private set; }
public int? BossId { get; private set; }
public string Name { get; private set; }
public Employee(int id, int? bossId, string name)
{
Id = id;
BossId = bossId;
Name = name;
}
}
Образцы данных:
List<Employee> employees = new List<Employee>();
employees.Add(new Employee(1, null, "Tom Smith"));
employees.Add(new Employee(2, null, "Susan Jones"));
employees.Add(new Employee(3, 1, "Sally Davis"));
employees.Add(new Employee(4, 1, "Robert Roberts"));
employees.Add(new Employee(5, 3, "John Smith"));
employees.Add(new Employee(6, 2, "Tonya Little"));
employees.Add(new Employee(7, 3, "Ty Bell"));
employees.Add(new Employee(8, 4, "Helen Andrews"));
employees.Add(new Employee(9, 2, "Matt Huang"));
employees.Add(new Employee(10, 6, "Lisa Wilson"));
Процесс:
string searchTerm = "Smith";
var searchResults = employees.Where(e => e.Name.Contains(searchTerm));
List<Employee> outputList = new List<Employee>();
Action<IEnumerable<Employee>, List<Employee>> findUnderlings = null;
findUnderlings = (input, list) =>
{
foreach (Employee employee in input)
{
list.Add(employee);
var underlings = employees.Where(e => e.BossId == employee.Id);
findUnderlings(underlings, list);
}
};
findUnderlings(searchResults, outputList);
Показать вывод:
foreach (Employee employee in outputList)
{
Console.WriteLine("{0}\t{1}\t{2}", employee.Id, employee.Name, employee.BossId);
}
Результаты:
1 Tom Smith
3 Sally Davis 1
5 John Smith 3
7 Ty Bell 3
4 Robert Roberts 1
8 Helen Andrews 4
5 John Smith 3
И вы можете видеть, что он следует за верхним результатом, подчеркивание, подчинение подчиненного, следующий результат, любое подчинение и т. Д. Это работает для любого числаярусы.
Я не уверен, как это можно сделать в «порядке по» в Linq или даже обычном SQL, но это может означать только Я недостаточно умен, чтобы сделать это , а не это просто невозможно.