Entity Framework и таблица собственных ссылок - PullRequest
4 голосов
/ 05 сентября 2011

Мне нужна база данных, которая начинается с таблицы «Пользователь», которая должна самостоятельно ссылаться на себя и будет иметь очень глубокий график связанных объектов.Она должна быть похожа на левую сторону изображения ниже (без учета правой стороны).

enter image description here

Мне также нужно будет пройти через этот график как вверх, так и вниз, чтобывычислять проценты, итоги и т. д. Другими словами, в некоторых случаях мне нужно пройти весь график.

Возможно ли это и / или как это делается?Можно ли выполнить обход прямо в операторе LINQ?Примеры?

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

Примеры:

  1. Чтобы можно было рассчитать общие продажи для каждого пользователя под конкретным пользователем (чтобы у каждого пользователя был какой-то доход).
  2. Рассчитайте комиссию на определенном уровне дерева (например, еслиу верхнего человека было 3 человека, каждый из которых продавал продукт за 1 доллар, а комиссия составляла 50%, тогда было бы 1,50 доллара.)
  3. Если бы я запросил изображение выше (слева) для «B», мне следуетполучить "B, H, I, J, N, O"

Надеюсь, это поможет: S

Ответы [ 2 ]

3 голосов
/ 06 сентября 2011

Вы не можете пройти по всему дереву, используя только LINQ, таким образом, чтобы это преобразовывалось в один SQL-запрос (или их постоянное количество). Вы можете сделать это либо с одним запросом для каждого уровня, либо с одним запросом, который ограничен определенным количеством уровней (но такой запрос станет действительно большим со многими уровнями).

В T-SQL (я полагаю, вы используете MS SQL Server), вы можете сделать это, используя рекурсивные общие табличные выражения . Должна быть возможность поместить это в хранимую процедуру, которую вы можете использовать из LINQ для получения информации, которую вы действительно хотите.

Подводя итог, ваши варианты:

  1. Не используйте LINQ, только SQL с рекурсивным CTE
  2. Использование рекурсивного CTE в хранимой процедуре из LINQ
  3. Использовать LINQ, создавая один запрос для каждого уровня
  4. Использовать некрасивый запрос LINQ, ограниченный несколькими уровнями
0 голосов
/ 26 июня 2012

Я знаю, что уже поздно, но если вы посмотрите на алгоритмы Directed Graph, вы можете обойти рекурсивные проблемы. проверить эти 2 статьи:

http://www.sitepoint.com/hierarchical-data-database/

http://www.codeproject.com/Articles/22824/A-Model-to-Represent-Directed-Acyclic-Graphs-DAG-o

...