Сложный вопрос заказа (структура сущности) - PullRequest
4 голосов
/ 10 июня 2010

Хорошо, поэтому я начну с того, что я новичок во всем этом и делаю все возможное, чтобы работать над этим проектом.У меня есть объект сотрудника, который содержит поле руководителя.Когда кто-то входит в поиск на моей странице, в сетке данных отображаются сотрудники, чье имя соответствует запросу.Но мне нужно, чтобы он отображал всех сотрудников, которые отчитываются перед ними, и третий уровень сотрудников, подотчетных подчиненным исходного сотрудника.Мне нужно только три уровня.Чтобы упростить эту задачу, сотрудники имеют только 3 ранга, поэтому, если ранг == 3, этот сотрудник не отвечает за других.Я полагаю, что лучший способ извлечь всех этих сотрудников из моей таблицы сотрудников - это что-то вроде

from employee in context.employees
where employee.name == search || employee.boss.name == search || 
employee.boss.boss.name == search

Но я не уверен, как сделать так, чтобы заказ выглядел так, как я хочу.Мне это нужно для отображения в слоях.Итак, это будет выглядеть так: Большой Босс - Босс - Подчиненный - Подчеркнутый - Босс - Подчиненный - Босс - Босс - Большой Босс -

Как я уже сказал, может быть более простой способ подойти ко всему этому вопросу, иесли есть, я все уши.Любой совет, который вы можете дать, будет высоко оценен.

Ответы [ 3 ]

4 голосов
/ 10 июня 2010

Это кажется трудным требованием для решения с использованием какой-либо конкретной платформы 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, но это может означать только Я недостаточно умен, чтобы сделать это , а не это просто невозможно.

2 голосов
/ 13 августа 2010

Привет, я думал, что опубликую способ, которым я решил эту проблему, на случай, если он пригодится кому-то еще.

var list = productQuery.ToList();
var productList = Functions.sortResultsList(list);




public static List<SolutionsModel.Version> 
   sortResultsList(List<SolutionsModel.Version> list)
{
    var productList = new List<SolutionsModel.Version>();

    int total = list.Count();
    int solutions = 0;
    int objects = 0;

    for (int length = 0; length < list.Count(); length++)
    {
        if (list[length].Product.TypeID == 1)
        {
            ++solutions;
        }
        else if (list[length].Product.TypeID == 2)
        {
            ++objects;
        }
    }

    //These nested for-loops create a list that is 
    //correctly ordered to fit correctly into the grid. 
    //Perhaps consider more efficient improvision at a later time.

    //These for loops can't be used if there are not any solutions 
    //in the results
    if (solutions != 0)
    {
        for (int x = 0; x < list.Count; x++)
        {
            if (list[x].Product.TypeID == 1)
            {
                productList.Add(list[x]);
                for (int y = 0; y < list.Count; y++)
                {
                    if (list[y].Product.TypeID != 1)
                    {
                        if (list[y].Product.Product2.ID == list[x].Product.ID && list[y].VersionNumber == list[x].VersionNumber)
                        {
                            productList.Add(list[y]);
                            for (int j = 0; j < list.Count; j++)
                            {
                                if (list[j].Product.TypeID == 3)
                                {
                                    if (list[j].Product.Product2.ID == list[y].Product.ID && list[j].VersionNumber == list[y].VersionNumber)
                                    {
                                        productList.Add(list[j]);
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }

    //This can't be used if the results do not contain any objects.
    if (objects != 0 && productList.Count != total)
    {
        for (int y = 0; y < list.Count; y++)
        {
            if (list[y].Product.TypeID == 2)
            {
                productList.Add(list[y]);
                for (int j = 0; j < list.Count; j++)
                {
                    if (list[j].Product.TypeID == 3)
                    {
                        if (list[j].Product.Product2.ID == list[y].productID && list[j].VersionNumber == list[y].VersionNumber)
                        {
                            productList.Add(list[j]);
                        }
                    }
                }
            }
        }

    }

    //If the results contain only modules, no sorting is required and the original list can be used.
    if (productList.Count != total)
    {
          return list;
    }

    return productList;
}
1 голос
/ 10 июня 2010

Я не знаю много о LINQ. Но почему этого нельзя сделать с помощью хранимой процедуры, на которую может ссылаться модель EF?

Я думаю, не стоит использовать LINQ для всего:)

РЕДАКТИРОВАТЬ: Причина, по которой я говорю, что использование хранимой процедуры имеет смысл, заключается в том, что EF придется генерировать SQL-запрос, чтобы делать то, что вы хотите, и то, что вы хотите делать, лучше выразить и контролировать в SQL.

...