Если ваша строка подключения настроена как обычный ключ установки приложения, например:
"MyConnection": "Server=localhost;Database=MyDb;User Id=test;Password=test;"
Затем, когда вы передаете IConfiguration
.NET Core в ваш ServiceStack AppHost:
app.UseServiceStack(new AppHost
{
AppSettings = new NetCoreAppSettings(Configuration)
});
[1111 ] Вы сможете получить его как обычную настройку приложения, например:
var myConn = AppSettings.GetString("MyConnection");
Если вместо этого вы настроите его в группе «ConnectionStrings», например:
"ConnectionStrings": {
"DefaultConnection": "Server=localhost;Database=MyDb;User Id=test;Password=test;"
},
Тогда Вы можете получить к нему доступ из объекта IConfiguration
, например:
var config = (NetCoreAppSettings) AppSettings;
var myConn = config.Configuration.GetConnectionString("DefaultConnection");
В качестве альтернативы вы также можете получить к нему доступ через обозначение иерархического ключа config , например:
var myConn = AppSettings.GetString("ConnectionStrings:DefaultConnection");
Вы могли записать функцию PL/PgSQL для выполнения рекурсии:
CREATE LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION get_top_parent(
child integer
) RETURNS integer as $$
DECLARE
parent integer;
last_parent integer;
BEGIN
last_parent := child;
SELECT INTO parent parentid
FROM example
WHERE id = child;
IF parent is NOT NULL THEN
parent := get_top_parent(parent);
ELSE
parent := last_parent;
END IF;
RETURN parent;
END
$$ LANGUAGE plpgsql;
Эта функция может определенно быть оптимизирована. Это, вероятно, будет медленно, если глубина будет очень высока, и таблицы являются большими, таким образом, как Jegern упомянул, что могло бы стоить кэшировать иерархию, возможно с помощью триггеров и такого.
Изучите книги Joe Celko, SQL для Присяжных острословов и его книги по Деревьям и Иерархиям. У него есть раздел или два в SQL для Присяжных острословов на деревьях и иерархиях, или если Вы хотите действительно войти в него затем, можно получить другую книгу. SQL для Присяжных острословов также затронет большое другое проектирование баз данных и запросы информации. Некоторый действительно хороший материал там. Он представляет альтернативные способы смоделировать деревья, которые могут работать намного лучше, чем модель списка смежности, которую Вы используете.
В одной из его моделей вопрос, "кто самый верхний родитель", становится очень тривиальным.
Можно рассмотреть использование "ltree" contrib модуль.
По моему опыту, SQL не очень хорош в этом виде запроса (рекурсия). Я предложил бы составить дополнительную таблицу с идентификатором и главным родительским идентификатором. Как Вы добавляете больше детей, Вы просто ищете, это - главный родительский идентификатор родителя, и вставьте соответствующую строку в дополнительную таблицу.
Вы могли также сохранить главный родительский идентификатор в своей исходной таблице.