Самообращающиеся таблицы в Linq2Sql - PullRequest
0 голосов
/ 13 апреля 2010

Я видел много вопросов о самоссылающихся таблицах в Linq2Sql и о том, как с готовностью загрузить все дочерние записи для определенного корневого объекта. Я реализовал временное решение, получив доступ ко всем базовым свойствам, но вы можете видеть, что это не приносит пользы.

Дело в том, что все записи связаны друг с другом с использованием GUID корреляции. Пример ниже:

RootElement
- Id: 1
- ParentId: null
- CorrelationId: 4D68E512-4B55-44f4-BA5A-174B630A03DD

ChildElement1
- Id: 2
- ParentId: 1
- CorrelationId: 4D68E512-4B55-44f4-BA5A-174B630A03DD

ChildElement2
- Id: 3
- ParentId: 2
- CorrelationId: 4D68E512-4B55-44f4-BA5A-174B630A03DD

ChildElement1
- Id: 4
- ParentId: 2
- CorrelationId: 4D68E512-4B55-44f4-BA5A-174B630A03DD

В моем случае у меня есть доступ к correlationId, поэтому я могу получить все свои записи, выполнив следующий запрос:

from element in db.Elements
where element.CorrelationId == '4D68E512-4B55-44f4-BA5A-174B630A03DD'
select element;

Но, конечно, я хочу, чтобы эти элементы были связаны друг с другом, выполняя этот запрос:

from element in db.Elements
where element.CorrelationId == '4D68E512-4B55-44f4-BA5A-174B630A03DD' && element.ParentId == null
select element;

Мой вопрос: возможно ли объединить результаты первого запроса в качестве некоего «механизма кэширования» для запроса, в котором я получаю корневой элемент?

Спасибо за ввод.

J.

1 Ответ

0 голосов
/ 13 апреля 2010

Мне не совсем понятно, что вы пытаетесь сделать или что вы подразумеваете под «механизмом кэширования». Как второй запрос создает какую-либо связь?

Моя первая догадка - вы хотите сгруппировать результаты по родителям, и в этом случае вы можете просто вызвать GroupBy(x => x.ParentId) по результатам первого запроса.

Мое второе предположение заключается в том, что ваш второй запрос состоит в том, чтобы получить только корневые элементы, и в этом случае вы просто вызываете Where(x => x.ParentId == null) для результатов первого запроса.

Пожалуйста, уточните, если это не то, что вы ищете.

редактирование:

В ответ на ваш первый комментарий, вот как выполнить два запроса:

var correlated_elements = db.Elements.Where(element => element.CollelationId == '4D68E512-4B55-44f4-BA5A-174B630A03DD');
var root_elements = correlated_elements.Where(element => element.ParentId == null);

Это только сделает один запрос к базе данных. Тем не менее, ваш второй запрос не создает иерархию - он просто возвращает элементы без ParentId. Если вы можете описать желаемую иерархию, мы можем выполнить запрос для ее достижения.

Если вы не уверены, какие запросы фактически выполняются к базе данных, вы можете вывести SQL на консоль или использовать пробную версию LINQ-to-SQL Profiler .

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