{"id":337576,"date":"2022-08-26T15:00:36","date_gmt":"2022-08-26T15:00:36","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=337576"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=337576","title":{"rendered":"<span>Materialized Path \u2013 \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u0441\u0432\u043e\u0451 \u043f\u0435\u0440\u0432\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e<\/span>"},"content":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/cf2\/689\/921\/cf26899213379d591601093b84d53249.jpg\" width=\"1560\" height=\"880\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/cf2\/689\/921\/cf26899213379d591601093b84d53249.jpg\" data-blurred=\"true\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0425\u0443\u0441\u0440\u0430\u0432, \u044f \u0431\u044d\u043a\u0435\u043d\u0434 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0432 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 Bimeister. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0431\u044b \u0445\u043e\u0442\u0435\u043b \u0431\u044b \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c \u043e \u0441\u043f\u043e\u0441\u043e\u0431\u0435 \u043f\u043e\u0438\u0441\u043a\u0430 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0445 \u0438 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e\u043c PostgreSQL Materialized Path.<\/p>\n<h3>\u0426\u0435\u043b\u044c<\/h3>\n<p>\u0423\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0442\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u0442\u0435\u043c\u044b \u0438 \u043d\u0430 \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445 \u043f\u0440\u043e\u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 Materialized Path. \u042d\u0442\u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u043c\u043e\u0433\u0443\u0442 \u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u043c\u0438 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e\u043c \u0440\u0435\u043b\u044f\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0421\u0423\u0411\u0414.<\/p>\n<p>\u0421\u0442\u0430\u0442\u044c\u044f \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u0432\u043e\u0434\u043d\u043e\u0439 \u0438 \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u043d\u0430 \u043d\u0430 \u043b\u044e\u0434\u0435\u0439, \u043d\u0435\u0437\u043d\u0430\u043a\u043e\u043c\u044b\u0445 \u0441 \u0442\u0435\u043c\u043e\u0439.<\/p>\n<h3>\u0414\u0438\u0441\u043a\u043b\u0435\u0439\u043c\u0435\u0440<\/h3>\n<p>\u0421\u0440\u0430\u0437\u0443 \u043e\u0433\u043e\u0432\u043e\u0440\u044e\u0441\u044c, \u0447\u0442\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u0435\u0440\u0435\u0432\u044c\u0435\u0432 \u0432 \u0440\u0435\u043b\u044f\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0431\u0430\u0437\u0435. \u0414\u043b\u044f \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u043b\u0435\u043d\u0438\u044f \u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u043d\u0438\u043c\u0438 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u043a \u043f\u0440\u043e\u0447\u0442\u0435\u043d\u0438\u044e <a href=\"https:\/\/habr.com\/ru\/company\/bimeister\/blog\/672634\/\">\u0441\u0442\u0430\u0442\u044c\u044e \u043c\u043e\u0435\u0433\u043e \u043a\u043e\u043b\u043b\u0435\u0433\u0438 \u043d\u0430 \u044d\u0442\u0443 \u0442\u0435\u043c\u0443<\/a>. \u041d\u0438\u0436\u0435 \u044f \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u044e \u043b\u0438\u0448\u044c \u043e\u0434\u0438\u043d \u0438\u0437 \u043d\u0438\u0445, \u0438 \u0443\u043f\u043e\u0440 \u0431\u0443\u0434\u0435\u0442 \u0441\u0434\u0435\u043b\u0430\u043d, \u043f\u0440\u0435\u0436\u0434\u0435 \u0432\u0441\u0435\u0433\u043e, \u043d\u0430 \u043b\u0451\u0433\u043a\u043e\u0441\u0442\u044c \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432.<\/p>\n<h3>\u041d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u0440\u0435\u0434\u044b\u0441\u0442\u043e\u0440\u0438\u0438<\/h3>\n<p>\u0414\u043e \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043c\u043e\u0438\u043c \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u043c \u0441\u0442\u0435\u043a\u043e\u043c \u0431\u044b\u043b\u0430 \u0441\u0432\u044f\u0437\u043a\u0430 C# \u0438 MSSQL, \u0438 \u043c\u043d\u0435 \u043d\u0435 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u043b\u043e\u0441\u044c \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0441 \u0434\u0435\u0440\u0435\u0432\u044c\u044f\u043c\u0438. \u042f \u043f\u0440\u0438\u0432\u044b\u043a \u0434\u0443\u043c\u0430\u0442\u044c, \u0447\u0442\u043e \u043a\u043e\u0433\u0434\u0430 \u0440\u0435\u0447\u044c \u0437\u0430\u0445\u043e\u0434\u0438\u0442 \u043e \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445, \u0442\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u043e \u0443\u043f\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0432 \u0433\u0440\u0430\u0444\u043e\u0432\u0443\u044e \u0411\u0414, \u043e\u0434\u043d\u0430\u043a\u043e \u0437\u0434\u0435\u0441\u044c \u044f \u0431\u044b\u043b \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d \u0440\u0435\u043b\u044f\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0411\u0414. \u0412 \u044d\u0442\u0438\u0445 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f\u0445 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043b\u043e\u0433\u0438\u0447\u043d\u044b\u043c \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0434\u0435\u0440\u0435\u0432\u044c\u044f\u043c\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c \u0431\u044b\u043b\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u0435\u0440\u0435\u0432\u0430 \u0432 PostgreSQL \u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e\u043c Materialized Path. \u042d\u0442\u0438\u043c \u043f\u043e\u0434\u0445\u043e\u0434\u043e\u043c \u044f \u0438 \u0441\u043f\u0435\u0448\u0443 \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0441 \u0432\u0430\u043c\u0438.<\/p>\n<h3>\u0418\u0442\u0430\u043a, \u043d\u0430\u0447\u043d\u0435\u043c!<\/h3>\n<p>\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c, \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043d\u0435\u043a\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e \u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442\u043d\u044b\u0445 \u0441\u0440\u0435\u0434\u0441\u0442\u0432, \u0438 \u043d\u0430\u0448\u0430 \u0437\u0430\u0434\u0430\u0447\u0430 \u2014 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0435 \u0438 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/885\/a19\/8e1\/885a198e10393ea7aa61013aad9d3e08.png\" width=\"611\" height=\"330\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/885\/a19\/8e1\/885a198e10393ea7aa61013aad9d3e08.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0412 \u0442\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u0435\u0440\u0435\u0432\u043e \u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e\u043c Materialized Path&#8230;\u00a0<\/p>\n<h3>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u043c \u043d\u0430\u0448\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435<\/h3>\n<p>\u041d\u0430\u0447\u043d\u0435\u043c \u0441 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 PostgreSQL \u0432 docker-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440.<\/p>\n<ol>\n<li>\n<p> \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c <a href=\"https:\/\/www.docker.com\/products\/docker-desktop\/\">docker desktop<\/a>.<\/p>\n<\/li>\n<li>\n<p>\u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u043b\u044e\u0431\u0438\u043c\u044b\u0439 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b, \u0432 \u043c\u043e\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u044d\u0442\u043e <a href=\"https:\/\/git-scm.com\/downloads\">git bash<\/a>.<\/p>\n<\/li>\n<li>\n<p>\u0421\u043a\u0430\u0447\u0438\u0432\u0430\u0435\u043c <a href=\"https:\/\/hub.docker.com\/_\/postgres\">\u043e\u0431\u0440\u0430\u0437 postgres c docker hub<\/a>.<\/p>\n<p><code>docker pull postgres<\/code><\/p>\n<\/li>\n<li>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c docker-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0441 \u043d\u0430\u0448\u0435\u0439 \u0431\u0430\u0437\u043e\u0439 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<p><code>docker run --name myPostgresDb -p 5455:5432 -e POSTGRES_USER=postgresUser\u00a0-e POSTGRES_PASSWORD=postgresPW -e POSTGRES_DB=postgres -d postgres<\/code><\/p>\n<p>\u00a0<u>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435<\/u>:<\/p>\n<ul>\n<li>\n<p>myPostgresDb \u2014 \u0438\u043c\u044f \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430<\/p>\n<\/li>\n<li>\n<p>5455:5432 \u2014 \u043f\u043e\u0440\u0442 \u0434\u043b\u044f \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0443<\/p>\n<\/li>\n<li>\n<p>postgresUser \u2014 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c<\/p>\n<\/li>\n<li>\n<p>postgresPW \u2014 \u043f\u0430\u0440\u043e\u043b\u044c<\/p>\n<\/li>\n<li>\n<p>postgres \u2014 \u0438\u043c\u044f \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p>\u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u043b\u044e\u0431\u0438\u043c\u044b\u0439 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0431\u0430\u0437\u043e\u0439 \u0434\u0430\u043d\u043d\u044b\u0445 PostgreSQL. \u0412 \u043c\u043e\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e PgAdmin.<\/p>\n<\/li>\n<li>\n<p>\u041d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0432 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0435:<\/p>\n<p><u>Name<\/u>: MyPostresDB.<\/p>\n<p><u>\u0412\u043a\u043b\u0430\u0434\u043a\u0430 Connection<\/u><strong>:<\/strong><\/p>\n<p><u>Host:<\/u> localhost<\/p>\n<p><u>Port<\/u>: 5455<\/p>\n<p><u>Maintenance Database:<\/u> postgres<\/p>\n<p><u>UserName:<\/u> postgresUser<\/p>\n<p><u>Password:<\/u> postgresPW<\/p>\n<\/li>\n<\/ol>\n<p>\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f <a href=\"https:\/\/www.code4it.dev\/blog\/run-postgresql-with-docker\">\u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f<\/a> \u043f\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435 PostgreSQL \u0432 docker. <\/p>\n<h3>\u041d\u0430\u043f\u043e\u043b\u043d\u0438\u043c \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u043d\u0430\u0448 \u0441\u0442\u0435\u043d\u0434<\/h3>\n<ol>\n<li>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0438 \u0438\u043d\u0434\u0435\u043a\u0441 GIST:<\/p>\n<p><code>create table transport (name text, path ltree);<\/code><\/p>\n<p><code>create index path_gist_idx on transport using GIST (path);<\/code> <\/p>\n<p>\u0418\u043d\u0434\u0435\u043a\u0441 GIST \u0434\u0430\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0442\u0430\u043a\u0438\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f (<a href=\"https:\/\/postgrespro.ru\/docs\/postgresql\/9.6\/ltree\">\u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435<\/a>):<\/p>\n<p>\u00a0<code>&lt;, &lt;=, =, >=, >, @>, &lt;@, @, ~, ?<\/code> <\/p>\n<p><u>\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435<\/u>: \u0435\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0432\u044b\u0434\u0430\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0443, \u0447\u0442\u043e \u043d\u0435\u0442 \u0442\u0430\u043a\u043e\u0433\u043e \u0442\u0438\u043f\u0430, \u043a\u0430\u043a ltree, \u0442\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u0443:<\/p>\n<p><code>create extension ltree<\/code><\/p>\n<\/li>\n<li>\n<p> \u041d\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438:<\/p>\n<pre><code>insert into transport values ('Transport', 'Transport'); insert into transport values ('Car', 'Transport.Car'); insert into transport values ('Truck', 'Transport.Car.Truck'); insert into transport values ('Van', 'Transport.Car.Van'); insert into transport values ('Sedan', 'Transport.Car.Sedan'); insert into transport values ('Boat', 'Transport.Boat'); insert into transport values ('Yacht', 'Transport.Boat.Yacht'); insert into transport values ('SailBoat', 'Transport.Boat.SailBoat'); insert into transport values ('Aircraft', 'Transport.AirCraft'); insert into transport values ('Helicopter', 'Transport.AirCraft.Helicopter'); insert into transport values ('Jet', 'Transport.AirCraft.Jet'); insert into transport values ('AirBus', 'Transport.AirCraft.AirBus');<\/code><\/pre>\n<\/li>\n<li>\n<p>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435:<\/p>\n<p>\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 &#8216;Transport.Car&#8217;:<\/p>\n<pre><code>select * from transport  where \"path\" &lt;@ 'Transport.Car'<\/code><\/pre>\n<p>\u00a0\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 &#8216;Transport.AirCraft.AirBus&#8217;:<\/p>\n<pre><code>select * from transport where \"path\" @> 'Transport.AirCraft.AirBus'<\/code><\/pre>\n<p>\u041a\u0430\u043a \u0432\u0438\u0434\u043d\u043e \u0438\u0437 \u043f\u0440\u0438\u043c\u0435\u0440\u0430, \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u0441\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0432 \u043d\u0435\u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043a \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<p>\u041e\u0431 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044f\u0445 Ltree Materialized Path \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c <a href=\"https:\/\/www.postgresql.org\/docs\/current\/ltree.html\">\u0432 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438.<\/a> <\/p>\n<\/li>\n<\/ol>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u0435\u0440\u0435\u0439\u0434\u0435\u043c \u043a \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044e \u043d\u0430\u0448\u0435\u0433\u043e \u0432\u0435\u0431-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0434\u0435\u0440\u0435\u0432\u043e\u043c \u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e\u043c API \u0438 Entity Framework Core.\u00a0<\/p>\n<h3>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442 ASP.NET Core Web API <\/h3>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442 \u0441 \u0442\u0438\u043f\u043e\u043c ASP.NET Core Web API \u0438 \u043d\u0430\u0437\u043e\u0432\u0435\u043c \u043d\u0430\u0448 \u043f\u0440\u043e\u0435\u043a\u0442 MaterializedPathAPI. <\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/cfb\/db1\/0e2\/cfbdb10e2abfab82818500eedddce86b.png\" width=\"994\" height=\"649\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/cfb\/db1\/0e2\/cfbdb10e2abfab82818500eedddce86b.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u0443\u0435\u043c \u043d\u0430\u0448 \u043f\u0440\u043e\u0435\u043a\u0442 \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u043c:   <\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/a25\/52d\/a70\/a2552da705888be2e150651aaa607c90.png\" width=\"914\" height=\"619\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/a25\/52d\/a70\/a2552da705888be2e150651aaa607c90.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c nuget \u043f\u0430\u043a\u0435\u0442\u044b:<\/p>\n<ol>\n<li>\n<p>Npgsql.EntityFrameworkCore.PostgreSQL.<\/p>\n<\/li>\n<li>\n<p>Microsoft.EntityFrameworkCore.Design.<\/p>\n<\/li>\n<li>\n<p>Microsoft.EntityFrameworkCore.Tools.<\/p>\n<\/li>\n<\/ol>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u043c\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0431\u0443\u0434\u0443\u0442:<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/github.com\/KhusravBim\/MaterializedPathTreeApi\/blob\/main\/Controllers\/TreeController.cs\">TreeController<\/a> \u2013 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0438\u0437\u0432\u043d\u0435 \u0441 \u043d\u0430\u0448\u0438\u043c API;<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/KhusravBim\/MaterializedPathTreeApi\/blob\/main\/TreeService.cs\">TreeService<\/a> \u2013 \u0441\u0435\u0440\u0432\u0438\u0441 \u0441 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043b\u043e\u0433\u0438\u043a\u043e\u0439;<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/KhusravBim\/MaterializedPathTreeApi\/blob\/main\/DB\/TreeContext.cs\">TreeContext<\/a> \u2013 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0438\u0439 EntityFrame Work Core;<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/KhusravBim\/MaterializedPathTreeApi\/blob\/main\/DB\/TreeRepository.cs\">TreeRepository<\/a> \u2013 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445.\u00a0 <\/p>\n<\/li>\n<\/ul>\n<h3>\u0417\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442 \u043d\u0443\u0436\u043d\u044b\u043c\u0438 \u043f\u0430\u043f\u043a\u0430\u043c\u0438 \u0438 \u0444\u0430\u0439\u043b\u0430\u043c\u0438<\/h3>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043f\u0430\u043f\u043a\u0443 DB \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043f\u0430\u043f\u043a\u0443 Models, \u0430 \u0432 \u043d\u0435\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u0434\u0435\u0440\u0435\u0432\u0430:<\/p>\n<ol>\n<li>\n<p><a href=\"https:\/\/github.com\/KhusravBim\/MaterializedPathTreeApi\/blob\/main\/DB\/Models\/Tree.cs\">Tree.cs.<\/a><\/p>\n<pre><code>public class Tree { \u00a0\u00a0\u00a0\u00a0[Key] \u00a0\u00a0\u00a0\u00a0[StringLength(50, MinimumLength = 3)] \u00a0\u00a0\u00a0\u00a0public Guid Id { get; set; }  \u00a0\u00a0\u00a0\u00a0[Required] \u00a0 \u00a0\u00a0[StringLength(50)] \u00a0\u00a0\u00a0\u00a0public string Name { get; set; }  \u00a0\u00a0\u00a0\u00a0[Required] \u00a0\u00a0\u00a0\u00a0[StringLength(5)] \u00a0\u00a0\u00a0\u00a0public string Sorting { get; set; } }<\/code><\/pre>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/KhusravBim\/MaterializedPathTreeApi\/blob\/main\/DB\/Models\/TreeItem.cs\">TreeItem.cs.<\/a> \u041a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b TreeItems \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0434\u0435\u0440\u0435\u0432\u0430. <\/p>\n<pre><code>[Index(nameof(EntityId))] [Index(nameof(ParentEntityId))] [Index(nameof(TreeKey))] [Index(nameof(MaterializedPath))] public class TreeItem { \u00a0\u00a0\u00a0\u00a0[Key] \u00a0\u00a0\u00a0\u00a0[DatabaseGenerated(DatabaseGeneratedOption.Identity)] \u00a0\u00a0\u00a0\u00a0public Guid Id { get; set; }  \u00a0\u00a0\u00a0\u00a0[Required] \u00a0\u00a0\u00a0\u00a0public Guid EntityId { get; set; } \u00a0 \u00a0\u00a0\u00a0\u00a0public Guid? ParentEntityId { get; set; }  \u00a0\u00a0\u00a0\u00a0[Required] \u00a0\u00a0\u00a0\u00a0public string EntityValue { get; set; }  \u00a0\u00a0\u00a0\u00a0[Column(TypeName = \"ltree\")] \u00a0\u00a0\u00a0\u00a0public LTree MaterializedPath { get; set; }   \u00a0 \u00a0public Guid TreeKey { get; set; }  \u00a0\u00a0\u00a0\u00a0[NotMapped] \u00a0\u00a0\u00a0\u00a0public int Level { get; set; } \/\/\u0434\u043b\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0443\u0440\u043e\u0432\u043d\u044f \u0438\u0437 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 MaterializedPath.Nlevel }<\/code><\/pre>\n<\/p>\n<\/li>\n<\/ol>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 <a href=\"https:\/\/github.com\/KhusravBim\/MaterializedPathTreeApi\/blob\/main\/DB\/TreeContext.cs\">TreeContext.cs<\/a> \u0432 \u043f\u0430\u043f\u043a\u0435 DB. \u0412 \u044d\u0442\u043e\u043c \u043a\u043b\u0430\u0441\u0441\u0435 \u0432 \u043c\u0435\u0442\u043e\u0434\u0435 OnModelCreating() \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0438\u043d\u0434\u0435\u043a\u0441 \u00abgist\u00bb \u043a \u0442\u0430\u0431\u043b\u0438\u0446\u0435 TreeItem \u0434\u043b\u044f \u0431\u043e\u043b\u0435\u0435 \u0443\u0434\u043e\u0431\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 LTree. \u041c\u044b \u0441\u043c\u043e\u0436\u0435\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043c\u0435\u0442\u043e\u0434\u0430\u043c\u0438 \u0438 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438 LTree, \u0430\u043d\u0430\u043b\u043e\u0433\u0430\u043c\u0438 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043d\u0430 PostgreSQL \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043d\u0438\u0436\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b:<\/p>\n<p><code>&lt;, &lt;=, =, >=, >, @>, &lt;@, @, ~, ? (\u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u0432 \u043e\u0444. \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438)<\/code><\/p>\n<pre><code>public class TreeContext : DbContext { \u00a0\u00a0\u00a0\u00a0public TreeContext(DbContextOptions&lt;TreeContext> options) : base(options) { } \u00a0\u00a0\u00a0\u00a0public DbSet&lt;Tree> Trees { get; set; } \u00a0\u00a0\u00a0\u00a0public DbSet&lt;TreeItem> TreeItems { get; set; }  \u00a0\u00a0\u00a0\u00a0protected override void OnModelCreating(ModelBuilder modelBuilder) \u00a0\u00a0\u00a0\u00a0{ \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0modelBuilder.HasPostgresExtension(\"ltree\"); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0base.OnModelCreating(modelBuilder); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0modelBuilder.Entity&lt;TreeItem>() \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.HasIndex(treeItem => treeItem.MaterializedPath) \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.HasMethod(\"gist\"); \/\/\u0442\u0443\u0442 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0438\u043d\u0434\u0435\u043a\u0441 gist \u0434\u043b\u044f \u0431\u043e\u043b\u0435\u0435 \u0443\u0434\u043e\u0431\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 Ltree \u00a0\u00a0\u00a0\u00a0} }<\/code><\/pre>\n<h3>\u041b\u043e\u0433\u0438\u043a\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0434\u0435\u0440\u0435\u0432\u0430<\/h3>\n<p>\u041f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u043d\u043e\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430, \u043f\u0435\u0440\u0432\u044b\u043c \u0434\u0435\u043b\u043e\u043c \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 MaterializedPath \u0435\u0433\u043e \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044f. \u0414\u0430\u043b\u0435\u0435 \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u043a\u043e\u043d\u043a\u0430\u0442\u0435\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e MaterializedPath \u0441\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 (EntityValue) \u0447\u0435\u0440\u0435\u0437 \u0442\u043e\u0447\u043a\u0443, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043f\u043e\u043b\u043d\u044b\u0439 \u043f\u0443\u0442\u044c \u043e\u0442 \u0432\u044b\u0448\u0435\u0441\u0442\u043e\u044f\u0449\u0438\u0445 \u043f\u043e \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u0438 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432. <\/p>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435 \u0435\u0441\u043b\u0438 \u0443 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0440\u0430\u0432\u043d\u043e \u201cfirst\u201d \u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u201csecond\u201d, \u0432 \u0438\u0442\u043e\u0433\u0435 \u0432 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0435 MaterialledPath \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u201cfist.second\u201d\u00a0<\/p>\n<pre><code>\/\/\u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0434\u043b\u044f \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f Materialized Path var parentTreeItem = await _context.TreeItems \u00a0\u00a0.Where(x => x.EntityId == treeItem.ParentEntityId) .FirstOrDefaultAsync();  \/\/\u041e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c Materialized Path \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 treeItem.MaterializedPath = \u00a0\u00a0\u00a0new LTree(parentTreeItem == null ? \u00a0\u00a0\u00a0\u00a0\u00a0GetPath(treeItem.EntityValue) : \u00a0\u00a0\u00a0\u00a0\u00a0ConcatPath(parentTreeItem.MaterializedPath, treeItem.EntityValue));<\/code><\/pre>\n<p>\u0414\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u0438 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043c\u0435\u0442\u043e\u0434\u0430\u043c\u0438 \u043a\u043b\u0430\u0441\u0441\u0430 Ltree:<\/p>\n<ol>\n<li>\n<p>\u041c\u0435\u0442\u043e\u0434 IsAncestorOf() \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0432 postgreSql \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0443 @> \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0432\u0441\u0435 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b. <\/p>\n<pre><code>var treeItem = await GetTreeItem(treeItemId);\u00a0 return await _context.TreeItems \u00a0\u00a0.Where(x => x.MaterializedPath.IsAncestorOf(treeItem.MaterializedPath));<\/code><\/pre>\n<\/li>\n<li>\n<p>\u041c\u0435\u0442\u043e\u0434 IsDescendantOf() \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0432 postgreSql \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0443 &lt;@ \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0432\u0441\u0435 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b.<\/p>\n<pre><code>var treeItem = await GetTreeItem(treeItemId);\u00a0 return await _context.TreeItems   .Where(x =>\u00a0x.MaterializedPath.IsDescendantOf(treeItem.MaterializedPath));<\/code><\/pre>\n<\/li>\n<\/ol>\n<p><u>\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435<\/u>: \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441\u043e \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e\u043c \u043a\u043b\u0430\u0441\u0441\u0430 TreeItem MaterializedPath (\u0442\u0438\u043f Ltree) \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c, \u0447\u0442\u043e \u0435\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u044b \u0438 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0434\u043e \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0441 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445. \u00a0<\/p>\n<p>\u0418\u0442\u0430\u043a, \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u043c. \u0421\u043e\u0437\u0434\u0430\u0435\u043c <a href=\"https:\/\/github.com\/KhusravBim\/MaterializedPathTreeApi\/blob\/main\/DB\/TreeRepository.cs\">TreeRepository.cs<\/a> \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043e\u043c \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043f\u0430\u043f\u043a\u0435 DB. \u0414\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0434\u0435\u0440\u0435\u0432\u0430 \u043d\u0430\u043c \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u044e\u0442\u0441\u044f:<\/p>\n<ul>\n<li>\n<p>\u043c\u0435\u0442\u043e\u0434 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043a\u043e\u0440\u043d\u044f \u0434\u0435\u0440\u0435\u0432\u0430 (\u0441\u0442\u0440. 16);<\/p>\n<\/li>\n<li>\n<p>\u043c\u0435\u0442\u043e\u0434 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 TreeItem (\u0441\u0442\u0440. 32);<\/p>\n<\/li>\n<li>\n<p>\u043c\u0435\u0442\u043e\u0434 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u0434\u0435\u0440\u0435\u0432\u0435 (\u0441\u0442\u0440. 59);<\/p>\n<\/li>\n<li>\n<p>\u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u0438 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 (\u0441\u0442\u0440. 116 \u0438 \u0441\u0442\u0440.139).<\/p>\n<\/li>\n<\/ul>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c <a href=\"https:\/\/github.com\/KhusravBim\/MaterializedPathTreeApi\/blob\/main\/TreeService.cs\">TreeService.cs<\/a> \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043b\u043e\u0433\u0438\u043a\u043e\u0439 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u043f\u0430\u043f\u043a\u0435. \u0414\u0430\u043d\u043d\u044b\u0439 \u0441\u0435\u0440\u0432\u0438\u0441 \u0431\u0443\u0434\u0435\u0442 \u0434\u043b\u044f \u043d\u0430\u0441 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u043c \u0437\u0432\u0435\u043d\u043e\u043c, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440.<\/p>\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0441\u0442\u0440\u043e\u043a\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a \u043d\u0430\u0448\u0435\u0439 \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 <a href=\"https:\/\/github.com\/KhusravBim\/MaterializedPathTreeApi\/blob\/main\/appsettings.json\">appsettings.json<\/a>:<\/p>\n<pre><code>\"ConnectionStrings\": { \u00a0\u00a0\u00a0\u00a0\"TreeConnection\": \"User ID=postgresUser;Password=postgresPW;Server=localhost;Port=5455;Database=postgres;Integrated Security=true;Pooling=true;\" }<\/code><\/pre>\n<p><strong>\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u0443\u0435\u043c \u043a\u043b\u0430\u0441\u0441 Program.<\/strong><\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u043d\u0435 \u0437\u0430\u043c\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0441 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435\u043c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432 \u0434\u043b\u044f\u00a0 dependency injection, \u0443\u0434\u0430\u043b\u0438\u043c app.UseAuthorization(), \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e \u0434\u043b\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a \u043d\u0430\u0448\u0435\u0439 \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 <a href=\"https:\/\/github.com\/KhusravBim\/MaterializedPathTreeApi\/blob\/main\/appsettings.json\">appsettings.json<\/a> \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0432 \u0441\u0435\u0440\u0432\u0438\u0441\u044b TreeRepository \u0438 TreeService:<\/p>\n<pre><code>var builder = WebApplication.CreateBuilder(args); builder.Services.AddControllers(); builder.Services.AddEndpointsApiExplorer(); builder.Services.AddEntityFrameworkNpgsql() \u00a0 .AddDbContext&lt;TreeContext>(opt => \u00a0\u00a0\u00a0\u00a0opt.UseNpgsql(builder.Configuration.GetConnectionString(\"TreeConection\"))); builder.Services.AddScoped&lt;TreeRepository>(); builder.Services.AddScoped&lt;TreeService>(); var app = builder.Build(); app.MapControllers(); app.Run();<\/code><\/pre>\n<p>\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u0443\u0435\u043c <a href=\"https:\/\/github.com\/KhusravBim\/MaterializedPathTreeApi\/blob\/main\/Properties\/launchSettings.json\">launchsettings.json<\/a>:<\/p>\n<pre><code>{ \u00a0\u00a0\u00a0 \"$schema\":   \"https:\/\/json.schemastore.org\/launchsettings.json\", \u00a0\u00a0\u00a0 \"profiles\":   { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \"MaterializedPathTreeAPI\":   { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \"commandName\":   \"Project\",  \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \"applicationUrl\":   \"http:\/\/localhost:5186\", \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \"environmentVariables\":   { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0   \"ASPNETCORE_ENVIRONMENT\": \"Development\" \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 } \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 } \u00a0\u00a0\u00a0 } }<\/code><\/pre>\n<p>\u041d\u0430\u043c \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043c\u043e\u0434\u0435\u043b\u0438 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043d\u0430\u0448\u0438\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c \u0438\u0437\u0432\u043d\u0435.<\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043f\u0430\u043f\u043a\u0443 Models \u0432 \u043a\u043e\u0440\u043d\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043f\u0430\u043f\u043a\u0443 Info \u0438 \u0437\u0430\u043d\u043e\u0441\u0438\u043c \u0432 \u043d\u0435\u0435 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438:<\/p>\n<ol>\n<li>\n<p>\u00a0<a href=\"https:\/\/github.com\/KhusravBim\/MaterializedPathTreeApi\/blob\/main\/Models\/CreateTreeInfo.cs\">CreateTreeInfo.cs<\/a> \u2013 \u043c\u043e\u0434\u0435\u043b\u044c \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430.<\/p>\n<pre><code>public class CreateTreeInfo { \u00a0\u00a0\u00a0\u00a0public Guid TreeKey { get; set; } \u00a0\u00a0\u00a0\u00a0public string Name { get; set; } }<\/code><\/pre>\n<\/li>\n<li>\n<p> <a href=\"https:\/\/github.com\/KhusravBim\/MaterializedPathTreeApi\/blob\/main\/Models\/GetTreeItemsByTreeInfo.cs\">GetTreeItemsByTreeInfo.cs<\/a> \u2013 \u043c\u043e\u0434\u0435\u043b\u044c \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432.<\/p>\n<ul>\n<li>\n<p>FromIndex \u2013 \u0438\u043d\u0434\u0435\u043a\u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430, \u0441 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0434\u0435\u0440\u0435\u0432\u043e.<\/p>\n<\/li>\n<li>\n<p>ToIndex -\u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f.<\/p>\n<\/li>\n<li>\n<p>ExpandedTreeItemIds \u2013 \u0441\u043f\u0438\u0441\u043e\u043a id \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432, \u0435\u0441\u043b\u0438 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0440\u0430\u0441\u043a\u0440\u044b\u0442\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0435\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043d\u0430 \u043f\u0435\u0440\u0432\u043e\u043c \u0443\u0440\u043e\u0432\u043d\u0435.<\/p>\n<\/li>\n<li>\n<p>TreeKey \u2013 id \u0434\u0435\u0440\u0435\u0432\u0430 \u0438\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044b Trees.<\/p>\n<pre><code>public class GetTreeItemsByTreeInfo { \u00a0\u00a0\u00a0\u00a0public Guid TreeKey { get; set; } \u00a0\u00a0\u00a0\u00a0public IReadOnlyCollection&lt;Guid>? ExpandedTreeItemIds { get; set; } \u00a0\u00a0\u00a0\u00a0public int FromIndex { get; set; } \u00a0\u00a0\u00a0\u00a0public int ToIndex { get; set; } }<\/code><\/pre>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/KhusravBim\/MaterializedPathTreeApi\/blob\/main\/Models\/TreeItemInfo.cs\">TreeItemInfo.cs<\/a> \u2013 \u043c\u043e\u0434\u0435\u043b\u044c \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 TreeItems.\u00a0<\/p>\n<pre><code>public class TreeItemInfo { \u00a0\u00a0\u00a0\u00a0[Required] \u00a0\u00a0\u00a0\u00a0public Guid Id { get; set; } \u00a0 \u00a0\u00a0\u00a0\u00a0public Guid? ParentId { get; set; } \u00a0\u00a0\u00a0\u00a0[Required] \u00a0\u00a0\u00a0\u00a0public string Value { get; set; } }<\/code><\/pre>\n<\/li>\n<\/ol>\n<p>K \u043f\u0430\u043f\u043a\u0435 Models \u0442\u0430\u043a\u0436\u0435 \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043f\u0430\u043f\u043a\u0443 View (\u044d\u0442\u043e \u043c\u043e\u0434\u0435\u043b\u0438 \u0434\u043b\u044f \u043e\u0442\u0432\u0435\u0442\u0430 \u043d\u0430 \u0437\u0430\u043f\u0440\u043e\u0441 \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440) \u0438 \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043a\u043b\u0430\u0441\u0441 <a href=\"https:\/\/github.com\/KhusravBim\/MaterializedPathTreeApi\/blob\/main\/Models\/View\/TreeItemView.cs\">TreeItemView.<\/a><\/p>\n<ul>\n<li>\n<p>EntityId \u2014 id \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u0434\u0435\u0440\u0435\u0432\u0435;<\/p>\n<\/li>\n<li>\n<p>ParentEntityId \u2014 id \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430;<\/p>\n<\/li>\n<li>\n<p>EntityValue \u2014 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430;<\/p>\n<\/li>\n<li>\n<p>Path \u2014 \u043f\u0443\u0442\u044c \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0441 \u043d\u0430\u0447\u0430\u043b\u0430 \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u0438. \u041a\u0430\u043a \u0433\u043e\u0432\u043e\u0440\u0438\u043b\u043e\u0441\u044c \u0432 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0432\u044b\u0448\u0435, \u0442\u0443\u0442 \u0431\u0443\u0434\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u201cfirst.second\u201d;<\/p>\n<\/li>\n<li>\n<p>Level \u2014 \u0443\u0440\u043e\u0432\u0435\u043d\u044c, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442. 1 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u2014 \u044d\u0442\u043e \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442. \u0427\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u0440\u043e\u0432\u043d\u044f, \u0442\u0435\u043c \u0432\u044b\u0448\u0435 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u0438.<\/p>\n<\/li>\n<\/ul>\n<pre><code>public class TreeItemView { \u00a0\u00a0\u00a0\u00a0public Guid EntityId { get; set; } \u00a0\u00a0\u00a0\u00a0public Guid? ParentEntityId { get; set; } \u00a0\u00a0\u00a0\u00a0public string EntityValue { get; set; } \u00a0\u00a0\u00a0\u00a0public string Path { get; set; } \u00a0\u00a0\u00a0\u00a0public int Level { get; set; } }<\/code><\/pre>\n<p>\u0418, \u043d\u0430\u043a\u043e\u043d\u0435\u0446, \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 <a href=\"https:\/\/github.com\/KhusravBim\/MaterializedPathTreeApi\/blob\/main\/Controllers\/TreeController.cs\">TreeController.cs<\/a> \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043d\u0430\u0448\u0438\u043c \u0432\u0435\u0431-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c \u0438\u0437\u0432\u043d\u0435 \u0432 \u043f\u0430\u043f\u043a\u0435 Controllers \u0432 \u043a\u043e\u0440\u043d\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430.<\/p>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u0430\u0448\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0432 \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c Package manager Console \u0438 \u0441\u043e\u0437\u0434\u0430\u0435\u043c Code-First \u0431\u0430\u0437\u0443 \u0434\u0430\u043d\u043d\u044b\u0445:<\/p>\n<pre><code>PM> enable-migrations<\/code><\/pre>\n<pre><code>PM> add-migration initial<\/code><\/pre>\n<pre><code>PM> update-database<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0432\u0441\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438 \u0432 \u043d\u0430\u0448\u0435\u0439 \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0433\u043e\u0442\u043e\u0432\u043e\u0435 API. \u041e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u043d\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u043d\u0430\u0448\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e\u043c API \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b. \u041e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043a \u043d\u0430\u0448\u0435\u043c\u0443 API \u044f \u043e\u0441\u0442\u0430\u0432\u043b\u044e \u0432\u0430\u043c \u0432 \u0432\u0438\u0434\u0435 \u0433\u043e\u0442\u043e\u0432\u044b\u0445 cUrl \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043d\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0438 \u043f\u043e\u0438\u0441\u043a \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0435\u0439.\u00a0 \u041c\u043e\u0436\u043d\u043e \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f <a href=\"https:\/\/learning.postman.com\/docs\/sending-requests\/graphql\/graphql\/#importing-the-query-as-a-curl-request\">\u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0435\u0439<\/a>, \u043a\u0430\u043a \u0438\u0445 \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 PostMan \u0434\u043b\u044f \u0431\u043e\u043b\u0435\u0435 \u0443\u0434\u043e\u0431\u043d\u043e\u0433\u043e \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u043d\u0438\u043c\u0438.<\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0434\u0435\u0440\u0435\u0432\u0430:<\/p>\n<pre><code>curl\u00a0--location\u00a0--request\u00a0POST\u00a0'http:\/\/localhost:5186\/tree\/tree'\u00a0\\ --header\u00a0'Content-Type:\u00a0application\/json'\u00a0\\ --data-raw\u00a0'{ \u00a0\u00a0\u00a0\u00a0\"treekey\":\u00a0\"6f806b0f-bdd9-461b-b109-dfa94871e55c\", \u00a0\u00a0\u00a0\u00a0\"sorttype\":\u00a0\"asc\", \u00a0\u00a0\u00a0\u00a0\"name\":\u00a0\"TransportTree\" }'<\/code><\/pre>\n<p>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043a\u043e\u0440\u043d\u0435\u0432\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432:<\/p>\n<pre><code>curl\u00a0--location\u00a0--request\u00a0POST\u00a0'http:\/\/localhost:5186\/tree\/6f806b0f-bdd9-461b-b109-dfa94871e55c\/treeitem'\u00a0\\ --header\u00a0'Content-Type:\u00a0application\/json'\u00a0\\ --data-raw\u00a0'{ \u00a0\u00a0\u00a0\u00a0\"id\":\u00a0\"c02d283f-70e5-43a2-8f5b-69f4ee93492e\", \u00a0\u00a0\u00a0\u00a0\"parentid\":\u00a0null, \u00a0\u00a0\u00a0\u00a0\"value\":\u00a0\"Car\" }'  curl\u00a0--location\u00a0--request\u00a0POST\u00a0'http:\/\/localhost:5186\/tree\/6f806b0f-bdd9-461b-b109-dfa94871e55c\/treeitem'\u00a0\\ --header\u00a0'Content-Type:\u00a0application\/json'\u00a0\\ --data-raw\u00a0'{ \u00a0\u00a0\u00a0\u00a0\"id\":\u00a0\"3af8fc64-08c2-4e7d-a80a-5636f689dc15\", \u00a0\u00a0\u00a0\u00a0\"parentid\":\u00a0null, \u00a0\u00a0\u00a0\u00a0\"value\":\u00a0\"Boat\" }'<\/code><\/pre>\n<p>\u042f \u043d\u0435 \u0431\u0443\u0434\u0443 \u0440\u0430\u0441\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0440\u0430\u0437\u0432\u0435\u0442\u0432\u043b\u0451\u043d\u043d\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430. \u0414\u0443\u043c\u0430\u044e, \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043b\u0438\u0447\u043d\u043e\u0439 \u0442\u0440\u0435\u043d\u0438\u0440\u043e\u0432\u043a\u043e\u0439 \u0434\u043b\u044f \u0432\u0430\u0441 \u0441\u0430\u043c\u0438\u0445. \u0414\u043e\u0431\u0430\u0432\u0438\u043c \u043f\u043e\u0431\u043e\u043b\u044c\u0448\u0435 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0434\u043b\u044f Car.<\/p>\n<pre><code>curl\u00a0--location\u00a0--request\u00a0POST\u00a0'http:\/\/localhost:5186\/tree\/6f806b0f-bdd9-461b-b109-dfa94871e55c\/treeitem'\u00a0\\ --header\u00a0'Content-Type:\u00a0application\/json'\u00a0\\ --data-raw\u00a0'{ \u00a0\u00a0\u00a0\u00a0\"id\":\u00a0\"3b5e9928-85c6-4316-ba46-1b223d6c0222\", \u00a0\u00a0\u00a0\u00a0\"parentid\":\u00a0\"c02d283f-70e5-43a2-8f5b-69f4ee93492e\", \u00a0\u00a0\u00a0\u00a0\"value\":\u00a0\"Van\" }'  curl\u00a0--location\u00a0--request\u00a0POST\u00a0'http:\/\/localhost:5186\/tree\/6f806b0f-bdd9-461b-b109-dfa94871e55c\/treeitem'\u00a0\\ --header\u00a0'Content-Type:\u00a0application\/json'\u00a0\\ --data-raw\u00a0'{ \u00a0\u00a0\u00a0\u00a0\"id\":\u00a0\"73e49e05-5ce2-4bca-aef4-d2f030848162\", \u00a0\u00a0\u00a0\u00a0\"parentid\":\u00a0\"c02d283f-70e5-43a2-8f5b-69f4ee93492e\", \u00a0\u00a0\u00a0\u00a0\"value\":\u00a0\"Truck\" }'<\/code><\/pre>\n<p>\u0418 \u0442\u0435\u043f\u0435\u0440\u044c \u043a Truck \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b:<\/p>\n<pre><code>curl\u00a0--location\u00a0--request\u00a0POST\u00a0'http:\/\/localhost:5186\/tree\/6f806b0f-bdd9-461b-b109-dfa94871e55c\/treeitem'\u00a0\\ --header\u00a0'Content-Type:\u00a0application\/json'\u00a0\\ --data-raw\u00a0'{ \u00a0\u00a0\u00a0\u00a0\"id\":\u00a0\"a037cef7-3f96-4637-b26c-1da56086b293\", \u00a0\u00a0\u00a0\u00a0\"parentid\":\u00a0\"73e49e05-5ce2-4bca-aef4-d2f030848162\", \u00a0\u00a0\u00a0\u00a0\"value\":\u00a0\"BigTruck\" }'  curl\u00a0--location\u00a0--request\u00a0POST\u00a0'http:\/\/localhost:5186\/tree\/6f806b0f-bdd9-461b-b109-dfa94871e55c\/treeitem'\u00a0\\ --header\u00a0'Content-Type:\u00a0application\/json'\u00a0\\ --data-raw\u00a0'{ \u00a0\u00a0\u00a0\u00a0\"id\":\u00a0\"c0a8b81c-fde9-4691-af8d-3afff13fb1b7\", \u00a0\u00a0\u00a0\u00a0\"parentid\":\u00a0\"73e49e05-5ce2-4bca-aef4-d2f030848162\", \u00a0\u00a0\u00a0\u00a0\"value\":\u00a0\"MiniTruck\" }'<\/code><\/pre>\n<p>\u0418 \u0435\u0449\u0435 \u0434\u043b\u044f \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u043e\u0441\u0442\u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 MicroTruck \u0434\u043b\u044f MiniTruck:<\/p>\n<pre><code>curl\u00a0--location\u00a0--request\u00a0POST\u00a0'http:\/\/localhost:5186\/tree\/6f806b0f-bdd9-461b-b109-dfa94871e55c\/treeitem'\u00a0\\ --header\u00a0'Content-Type:\u00a0application\/json'\u00a0\\ --data-raw\u00a0'{ \u00a0\u00a0\u00a0\u00a0\"id\":\u00a0\"7b091725-feb4-4acd-9077-bdfd4c08c31a\", \u00a0\u00a0\u00a0\u00a0\"parentid\":\u00a0\"c0a8b81c-fde9-4691-af8d-3afff13fb1b7\", \u00a0\u00a0\u00a0\u00a0\"value\":\u00a0\"MicroTruck\" }'<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043f\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 Car. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435.<\/p>\n<p>\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u0435\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 MiniTruck:<\/p>\n<pre><code>curl\u00a0--location\u00a0--request\u00a0GET\u00a0'http:\/\/localhost:5186\/tree\/treeitem\/7b091725-feb4-4acd-9077-bdfd4c08c31a\/parents'\u00a0\\ --header\u00a0'Content-Type:\u00a0application\/json'\u00a0\\ --data-raw\u00a0'{ \u00a0\u00a0\u00a0\u00a0\"id\":\u00a0\"c0a8b81c-fde9-4691-af8d-3afff13fb1b7\", \u00a0\u00a0\u00a0\u00a0\"parentid\":\u00a0\"73e49e05-5ce2-4bca-aef4-d2f030848162\", \u00a0\u00a0\u00a0\u00a0\"value\":\u00a0\"MiniTruck\" }'<\/code><\/pre>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442:<\/p>\n<pre><code>[ \u00a0\u00a0\u00a0\u00a0{ \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"entityId\":\u00a0\"c02d283f-70e5-43a2-8f5b-69f4ee93492e\", \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"parentEntityId\":\u00a0null, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"entityValue\":\u00a0\"Car\", \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"path\":\u00a0\"Car\", \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"level\":\u00a01 \u00a0\u00a0\u00a0\u00a0}, \u00a0\u00a0\u00a0\u00a0{ \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"entityId\":\u00a0\"73e49e05-5ce2-4bca-aef4-d2f030848162\", \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"parentEntityId\":\u00a0\"c02d283f-70e5-43a2-8f5b-69f4ee93492e\", \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"entityValue\":\u00a0\"Truck\", \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"path\":\u00a0\"Car.Truck\", \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"level\":\u00a02 \u00a0\u00a0\u00a0\u00a0}, \u00a0\u00a0\u00a0\u00a0{ \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"entityId\":\u00a0\"c0a8b81c-fde9-4691-af8d-3afff13fb1b7\", \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"parentEntityId\":\u00a0\"73e49e05-5ce2-4bca-aef4-d2f030848162\", \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"entityValue\":\u00a0\"MiniTruck\", \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"path\":\u00a0\"Car.Truck.MiniTruck\", \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"level\":\u00a03 \u00a0\u00a0\u00a0\u00a0} ]<\/code><\/pre>\n<p>\u041a\u0430\u043a \u0432\u0438\u0434\u043d\u043e \u0438\u0437 \u043e\u0442\u0432\u0435\u0442\u0430, \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u043f\u043e\u043b\u0435 level. 1 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u2014 \u044d\u0442\u043e \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0438, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0447\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u0443\u0440\u043e\u0432\u0435\u043d\u044c, \u0442\u0435\u043c \u043d\u0438\u0436\u0435 \u043f\u043e \u0434\u0435\u0440\u0435\u0432\u0443 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043e\u0442 Car:<\/p>\n<pre><code>curl\u00a0--location\u00a0--request\u00a0GET\u00a0'http:\/\/localhost:5186\/tree\/treeitem\/c02d283f-70e5-43a2-8f5b-69f4ee93492e\/children'\u00a0\\ --header\u00a0'Content-Type:\u00a0application\/json'\u00a0\\ --data-raw\u00a0'{ \u00a0\u00a0\u00a0\u00a0\"id\":\u00a0\"c0a8b81c-fde9-4691-af8d-3afff13fb1b7\", \u00a0\u00a0\u00a0\u00a0\"parentid\":\u00a0\"73e49e05-5ce2-4bca-aef4-d2f030848162\", \u00a0\u00a0\u00a0\u00a0\"value\":\u00a0\"MiniTruck\" }'<\/code><\/pre>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442:<\/p>\n<pre><code>[ \u00a0\u00a0\u00a0\u00a0{ \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"entityId\":\u00a0\"3b5e9928-85c6-4316-ba46-1b223d6c0222\", \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"parentEntityId\":\u00a0\"c02d283f-70e5-43a2-8f5b-69f4ee93492e\", \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"entityValue\":\u00a0\"Van\", \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"path\":\u00a0\"Car.Van\", \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"level\":\u00a02 \u00a0\u00a0\u00a0\u00a0}, \u00a0\u00a0\u00a0\u00a0{ \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"entityId\":\u00a0\"73e49e05-5ce2-4bca-aef4-d2f030848162\", \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"parentEntityId\":\u00a0\"c02d283f-70e5-43a2-8f5b-69f4ee93492e\", \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"entityValue\":\u00a0\"Truck\", \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"path\":\u00a0\"Car.Truck\", \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"level\":\u00a02 \u00a0\u00a0\u00a0\u00a0}, \u00a0\u00a0\u00a0\u00a0{ \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"entityId\":\u00a0\"a037cef7-3f96-4637-b26c-1da56086b293\", \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"parentEntityId\":\u00a0\"73e49e05-5ce2-4bca-aef4-d2f030848162\", \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"entityValue\":\u00a0\"BigTruck\", \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"path\":\u00a0\"Car.Truck.BigTruck\", \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"level\":\u00a03 \u00a0\u00a0\u00a0\u00a0}, \u00a0\u00a0\u00a0\u00a0{ \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"entityId\":\u00a0\"c0a8b81c-fde9-4691-af8d-3afff13fb1b7\", \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"parentEntityId\":\u00a0\"73e49e05-5ce2-4bca-aef4-d2f030848162\", \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"entityValue\":\u00a0\"MiniTruck\", \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"path\":\u00a0\"Car.Truck.MiniTruck\", \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"level\":\u00a03 \u00a0\u00a0\u00a0\u00a0}, \u00a0\u00a0\u00a0\u00a0{ \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"entityId\":\u00a0\"7b091725-feb4-4acd-9077-bdfd4c08c31a\", \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"parentEntityId\":\u00a0\"c0a8b81c-fde9-4691-af8d-3afff13fb1b7\", \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"entityValue\":\u00a0\"MicroTruck\", \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"path\":\u00a0\"Car.Truck.MiniTruck.MicroTruck\", \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"level\":\u00a04 \u00a0\u00a0\u00a0\u00a0} ]<\/code><\/pre>\n<p>\u0422\u0430\u043a\u0436\u0435 \u044f \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043e\u0441\u0442\u0430\u0432\u0438\u043b \u043c\u0435\u0442\u043e\u0434 \u0432 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0435 GetTreeItemsFlatTree, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043e\u0440\u043d\u0435\u0432\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0434\u0435\u0440\u0435\u0432\u0430, \u0438 \u0442\u0430\u043a\u0436\u0435 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043d\u0438\u0436\u043d\u0435\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f \u044d\u0442\u0438\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432, \u0435\u0441\u043b\u0438 \u0443\u043a\u0430\u0436\u0438\u0442\u0435 \u0432 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0435 ExpandedTreeItemIds \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0440\u0430\u0441\u043a\u0440\u044b\u0432\u0430\u0435\u043c\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430. \u0412\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440, \u0433\u0434\u0435 \u0440\u0430\u0441\u043a\u0440\u043e\u0435\u043c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442 Car \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430:<\/p>\n<pre><code>curl\u00a0--location\u00a0--request\u00a0POST\u00a0'http:\/\/localhost:5186\/tree\/flattree'\u00a0\\ --header\u00a0'Content-Type:\u00a0application\/json'\u00a0\\ --data-raw\u00a0'{ \u00a0\u00a0\u00a0\u00a0\"treekey\":\u00a0\"6f806b0f-bdd9-461b-b109-dfa94871e55c\", \u00a0\u00a0\u00a0\u00a0\"fromindex\":\u00a00, \u00a0\u00a0\u00a0\u00a0\"toindex\":\u00a0\"10\", \u00a0\u00a0\u00a0\u00a0\"ExpandedTreeItemIds\":\u00a0[ \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"c02d283f-70e5-43a2-8f5b-69f4ee93492e\"  \u00a0\u00a0\u00a0\u00a0] }'<\/code><\/pre>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442:<\/p>\n<pre><code>[ \u00a0\u00a0\u00a0\u00a0{ \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"entityId\":\u00a0\"3af8fc64-08c2-4e7d-a80a-5636f689dc15\", \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"parentEntityId\":\u00a0null, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"entityValue\":\u00a0\"Boat\", \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"path\":\u00a0\"Boat\", \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"level\":\u00a01 \u00a0\u00a0\u00a0\u00a0}, \u00a0\u00a0\u00a0\u00a0{ \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"entityId\":\u00a0\"c02d283f-70e5-43a2-8f5b-69f4ee93492e\", \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"parentEntityId\":\u00a0null, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"entityValue\":\u00a0\"Car\", \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"path\":\u00a0\"Car\", \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"level\":\u00a01 \u00a0\u00a0\u00a0\u00a0}, \u00a0\u00a0\u00a0\u00a0{ \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"entityId\":\u00a0\"73e49e05-5ce2-4bca-aef4-d2f030848162\", \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"parentEntityId\":\u00a0\"c02d283f-70e5-43a2-8f5b-69f4ee93492e\", \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"entityValue\":\u00a0\"Truck\", \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"path\":\u00a0\"Car.Truck\", \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"level\":\u00a02 \u00a0\u00a0\u00a0\u00a0}, \u00a0\u00a0\u00a0\u00a0{ \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"entityId\":\u00a0\"3b5e9928-85c6-4316-ba46-1b223d6c0222\", \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"parentEntityId\":\u00a0\"c02d283f-70e5-43a2-8f5b-69f4ee93492e\", \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"entityValue\":\u00a0\"Van\", \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"path\":\u00a0\"Car.Van\", \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"level\":\u00a02 \u00a0\u00a0\u00a0\u00a0} ]<\/code><\/pre>\n<h3>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h3>\n<p>\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u043a\u043e\u0441\u043d\u0443\u043b\u0438\u0441\u044c \u0442\u0435\u043c\u044b \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0434\u0435\u0440\u0435\u0432\u043e\u043c, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f PostgreSQL Materialized Path, \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u043b\u0438 \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u0441\u0442\u0435\u043d\u0434 \u0441 \u0434\u0435\u0440\u0435\u0432\u043e\u043c \u0438 API \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043d\u0438\u043c, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432. \u041f\u0440\u043e\u0448\u0443 \u043f\u0440\u043e\u0449\u0435\u043d\u0438\u044f, \u0435\u0441\u043b\u0438 \u0432 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043c\u0435\u0441\u0442\u0430\u0445 \u044f \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0441\u043a\u0440\u0443\u043f\u0443\u043b\u0451\u0437\u043d\u043e \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u043b \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0440\u043d\u044b\u0435 \u0432\u0435\u0449\u0438. \u041e\u0434\u043d\u0430\u043a\u043e, \u044f \u0443\u0432\u0435\u0440\u0435\u043d, \u043d\u0430 \u0431\u0430\u0437\u0435 \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u0432\u044b \u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c \u0433\u043b\u0443\u0431\u0436\u0435 \u043a\u0430\u043a \u0442\u0435\u043a\u0443\u0449\u0438\u0439, \u0442\u0430\u043a \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u0441\u043f\u043e\u0441\u043e\u0431\u044b \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0434\u0435\u0440\u0435\u0432\u044c\u044f\u043c\u0438, \u0438, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0443\u043b\u0443\u0447\u0448\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435.<\/p>\n<p>\u041c\u043d\u0435 \u043d\u0435 \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0441\u0438\u043b\u044c\u043d\u043e \u0443\u0445\u043e\u0434\u0438\u0442\u044c \u0432 \u0442\u0435\u043e\u0440\u0438\u044e, \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u043c\u043e\u0435\u0439 \u0437\u0430\u0434\u0430\u0447\u0435\u0439 \u0431\u044b\u043b\u043e \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442\u044c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0443 \u043f\u0440\u043e\u0447\u0443\u0432\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u044b \u0440\u0430\u0431\u043e\u0442\u044b Materialized Path, \u043f\u043e \u0448\u0430\u0433\u0430\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044f \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0443\u043f\u0440\u0430\u0436\u043d\u0435\u043d\u0438\u044f.<\/p>\n<p>\u0414\u0430\u043d\u043d\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u0432 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043c\u0435\u0440\u0435 \u0430\u0434\u0440\u0435\u0441\u043e\u0432\u0430\u043d\u0430 \u043c\u043d\u0435 \u0441\u0430\u043c\u043e\u043c\u0443 \u0438\u0437 \u043f\u0440\u043e\u0448\u043b\u043e\u0433\u043e. \u041c\u043d\u0435 \u043e\u043d\u0430 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u043b\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u043e\u0451 \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u044d\u0442\u043e\u0433\u043e \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u0430 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0434\u0435\u0440\u0435\u0432\u044c\u044f\u043c\u0438. \u041d\u0430\u0434\u0435\u044e\u0441\u044c, \u043e\u043d\u0430 \u0438 \u0432\u0430\u043c \u0431\u044b\u043b\u0430 \u043f\u043e\u043b\u0435\u0437\u043d\u0430 \u0438\u043b\u0438, \u043a\u0430\u043a \u043c\u0438\u043d\u0438\u043c\u0443\u043c, \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0430!<\/p>\n<p>P. S. \u0425\u043e\u0447\u0443 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u0432\u044b\u0431\u043e\u0440 \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0434\u0435\u0440\u0435\u0432\u044c\u044f\u043c\u0438 \u043e\u0447\u0435\u043d\u044c \u0432\u0430\u0440\u044c\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0439. \u0415\u0441\u043b\u0438 \u0442\u0435\u043c\u0430 \u0432\u0430\u043c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0430, \u043e\u0447\u0435\u043d\u044c \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c\u0438 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430\u043c\u0438:<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/company\/bimeister\/blog\/672634\/\">\u041e\u0431\u0437\u043e\u0440 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u043e\u0432 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u0435\u0440\u0435\u0432\u044c\u0435\u0432 \u0432 \u0440\u0435\u043b\u044f\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0411\u0414 \/ \u0425\u0430\u0431\u0440 (habr.com)<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/postgrespro.ru\/docs\/postgresql\/9.6\/ltree\">PostgreSQL : \u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f: 9.6: F.21. ltree : \u041a\u043e\u043c\u043f\u0430\u043d\u0438\u044f Postgres Professional<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/www.npgsql.org\/efcore\/api\/Microsoft.EntityFrameworkCore.LTree.html\">Struct LTree | Npgsql Documentation<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/postgrespro.ru\/docs\/postgresql\/9.6\/ltree\">PostgreSQL : \u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f: 9.6: F.21. ltree : \u041a\u043e\u043c\u043f\u0430\u043d\u0438\u044f Postgres Professional<\/a><\/p>\n<\/li>\n<\/ul>\n<p>\u0420\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0441 \u043a\u043e\u0434\u043e\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u043b\u0438 \u0432\u044b\u0448\u0435: <a href=\"https:\/\/github.com\/KhusravBim\/MaterializedPathTreeApi\">KhusravBim\/MaterializedPathTreeApi (github.com)<\/a>.\u00a0<\/p>\n<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"v-portal\" style=\"display:none;\"><\/div>\n<\/div>\n<p> <!----> <!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/company\/bimeister\/blog\/684818\/\"> https:\/\/habr.com\/ru\/company\/bimeister\/blog\/684818\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0425\u0443\u0441\u0440\u0430\u0432, \u044f \u0431\u044d\u043a\u0435\u043d\u0434 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0432 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 Bimeister. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0431\u044b \u0445\u043e\u0442\u0435\u043b \u0431\u044b \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c \u043e \u0441\u043f\u043e\u0441\u043e\u0431\u0435 \u043f\u043e\u0438\u0441\u043a\u0430 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0445 \u0438 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e\u043c PostgreSQL Materialized Path.<\/p>\n<h3>\u0426\u0435\u043b\u044c<\/h3>\n<p>\u0423\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0442\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u0442\u0435\u043c\u044b \u0438 \u043d\u0430 \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445 \u043f\u0440\u043e\u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 Materialized Path. \u042d\u0442\u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u043c\u043e\u0433\u0443\u0442 \u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u043c\u0438 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e\u043c \u0440\u0435\u043b\u044f\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0421\u0423\u0411\u0414.<\/p>\n<p>\u0421\u0442\u0430\u0442\u044c\u044f \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u0432\u043e\u0434\u043d\u043e\u0439 \u0438 \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u043d\u0430 \u043d\u0430 \u043b\u044e\u0434\u0435\u0439, \u043d\u0435\u0437\u043d\u0430\u043a\u043e\u043c\u044b\u0445 \u0441 \u0442\u0435\u043c\u043e\u0439.<\/p>\n<h3>\u0414\u0438\u0441\u043a\u043b\u0435\u0439\u043c\u0435\u0440<\/h3>\n<p>\u0421\u0440\u0430\u0437\u0443 \u043e\u0433\u043e\u0432\u043e\u0440\u044e\u0441\u044c, \u0447\u0442\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u0435\u0440\u0435\u0432\u044c\u0435\u0432 \u0432 \u0440\u0435\u043b\u044f\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0431\u0430\u0437\u0435. \u0414\u043b\u044f \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u043b\u0435\u043d\u0438\u044f \u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u043d\u0438\u043c\u0438 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u043a \u043f\u0440\u043e\u0447\u0442\u0435\u043d\u0438\u044e <a href=\"https:\/\/habr.com\/ru\/company\/bimeister\/blog\/672634\/\">\u0441\u0442\u0430\u0442\u044c\u044e \u043c\u043e\u0435\u0433\u043e \u043a\u043e\u043b\u043b\u0435\u0433\u0438 \u043d\u0430 \u044d\u0442\u0443 \u0442\u0435\u043c\u0443<\/a>. \u041d\u0438\u0436\u0435 \u044f \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u044e \u043b\u0438\u0448\u044c \u043e\u0434\u0438\u043d \u0438\u0437 \u043d\u0438\u0445, \u0438 \u0443\u043f\u043e\u0440 \u0431\u0443\u0434\u0435\u0442 \u0441\u0434\u0435\u043b\u0430\u043d, \u043f\u0440\u0435\u0436\u0434\u0435 \u0432\u0441\u0435\u0433\u043e, \u043d\u0430 \u043b\u0451\u0433\u043a\u043e\u0441\u0442\u044c \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432.<\/p>\n<h3>\u041d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u0440\u0435\u0434\u044b\u0441\u0442\u043e\u0440\u0438\u0438<\/h3>\n<p>\u0414\u043e \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043c\u043e\u0438\u043c \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u043c \u0441\u0442\u0435\u043a\u043e\u043c \u0431\u044b\u043b\u0430 \u0441\u0432\u044f\u0437\u043a\u0430 C# \u0438 MSSQL, \u0438 \u043c\u043d\u0435 \u043d\u0435 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u043b\u043e\u0441\u044c \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0441 \u0434\u0435\u0440\u0435\u0432\u044c\u044f\u043c\u0438. \u042f \u043f\u0440\u0438\u0432\u044b\u043a \u0434\u0443\u043c\u0430\u0442\u044c, \u0447\u0442\u043e \u043a\u043e\u0433\u0434\u0430 \u0440\u0435\u0447\u044c \u0437\u0430\u0445\u043e\u0434\u0438\u0442 \u043e \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445, \u0442\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u043e \u0443\u043f\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0432 \u0433\u0440\u0430\u0444\u043e\u0432\u0443\u044e \u0411\u0414, \u043e\u0434\u043d\u0430\u043a\u043e \u0437\u0434\u0435\u0441\u044c \u044f \u0431\u044b\u043b \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d \u0440\u0435\u043b\u044f\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0411\u0414. \u0412 \u044d\u0442\u0438\u0445 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f\u0445 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043b\u043e\u0433\u0438\u0447\u043d\u044b\u043c \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0434\u0435\u0440\u0435\u0432\u044c\u044f\u043c\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c \u0431\u044b\u043b\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u0435\u0440\u0435\u0432\u0430 \u0432 PostgreSQL \u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e\u043c Materialized Path. \u042d\u0442\u0438\u043c \u043f\u043e\u0434\u0445\u043e\u0434\u043e\u043c \u044f \u0438 \u0441\u043f\u0435\u0448\u0443 \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0441 \u0432\u0430\u043c\u0438.<\/p>\n<h3>\u0418\u0442\u0430\u043a, \u043d\u0430\u0447\u043d\u0435\u043c!<\/h3>\n<p>\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c, \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043d\u0435\u043a\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e \u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442\u043d\u044b\u0445 \u0441\u0440\u0435\u0434\u0441\u0442\u0432, \u0438 \u043d\u0430\u0448\u0430 \u0437\u0430\u0434\u0430\u0447\u0430 \u2014 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0435 \u0438 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430.<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u0412 \u0442\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u0435\u0440\u0435\u0432\u043e \u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e\u043c Materialized Path&#8230;\u00a0<\/p>\n<h3>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u043c \u043d\u0430\u0448\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435<\/h3>\n<p>\u041d\u0430\u0447\u043d\u0435\u043c \u0441 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 PostgreSQL \u0432 docker-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440.<\/p>\n<ol>\n<li>\n<p> \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c <a href=\"https:\/\/www.docker.com\/products\/docker-desktop\/\">docker desktop<\/a>.<\/p>\n<\/li>\n<li>\n<p>\u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u043b\u044e\u0431\u0438\u043c\u044b\u0439 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b, \u0432 \u043c\u043e\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u044d\u0442\u043e <a href=\"https:\/\/git-scm.com\/downloads\">git bash<\/a>.<\/p>\n<\/li>\n<li>\n<p>\u0421\u043a\u0430\u0447\u0438\u0432\u0430\u0435\u043c <a href=\"https:\/\/hub.docker.com\/_\/postgres\">\u043e\u0431\u0440\u0430\u0437 postgres c docker hub<\/a>.<\/p>\n<p><code>docker pull postgres<\/code><\/p>\n<\/li>\n<li>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c docker-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0441 \u043d\u0430\u0448\u0435\u0439 \u0431\u0430\u0437\u043e\u0439 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<p><code>docker run --name myPostgresDb -p 5455:5432 -e POSTGRES_USER=postgresUser\u00a0-e POSTGRES_PASSWORD=postgresPW -e POSTGRES_DB=postgres -d postgres<\/code><\/p>\n<p>\u00a0<u>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435<\/u>:<\/p>\n<ul>\n<li>\n<p>myPostgresDb \u2014 \u0438\u043c\u044f \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430<\/p>\n<\/li>\n<li>\n<p>5455:5432 \u2014 \u043f\u043e\u0440\u0442 \u0434\u043b\u044f \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0443<\/p>\n<\/li>\n<li>\n<p>postgresUser \u2014 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c<\/p>\n<\/li>\n<li>\n<p>postgresPW \u2014 \u043f\u0430\u0440\u043e\u043b\u044c<\/p>\n<\/li>\n<li>\n<p>postgres \u2014 \u0438\u043c\u044f \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p>\u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u043b\u044e\u0431\u0438\u043c\u044b\u0439 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0431\u0430\u0437\u043e\u0439 \u0434\u0430\u043d\u043d\u044b\u0445 PostgreSQL. \u0412 \u043c\u043e\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e PgAdmin.<\/p>\n<\/li>\n<li>\n<p>\u041d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0432 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0435:<\/p>\n<p><u>Name<\/u>: MyPostresDB.<\/p>\n<p><u>\u0412\u043a\u043b\u0430\u0434\u043a\u0430 Connection<\/u><strong>:<\/strong><\/p>\n<p><u>Host:<\/u> localhost<\/p>\n<p><u>Port<\/u>: 5455<\/p>\n<p><u>Maintenance Database:<\/u> postgres<\/p>\n<p><u>UserName:<\/u> postgresUser<\/p>\n<p><u>Password:<\/u> postgresPW<\/p>\n<\/li>\n<\/ol>\n<p>\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f <a href=\"https:\/\/www.code4it.dev\/blog\/run-postgresql-with-docker\">\u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f<\/a> \u043f\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435 PostgreSQL \u0432 docker. <\/p>\n<h3>\u041d\u0430\u043f\u043e\u043b\u043d\u0438\u043c \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u043d\u0430\u0448 \u0441\u0442\u0435\u043d\u0434<\/h3>\n<ol>\n<li>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0438 \u0438\u043d\u0434\u0435\u043a\u0441 GIST:<\/p>\n<p><code>create table transport (name text, path ltree);<\/code><\/p>\n<p><code>create index path_gist_idx on transport using GIST (path);<\/code> <\/p>\n<p>\u0418\u043d\u0434\u0435\u043a\u0441 GIST \u0434\u0430\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0442\u0430\u043a\u0438\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f (<a href=\"https:\/\/postgrespro.ru\/docs\/postgresql\/9.6\/ltree\">\u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435<\/a>):<\/p>\n<p>\u00a0<code>&lt;, &lt;=, =, >=, >, @>, &lt;@, @, ~, ?<\/code> <\/p>\n<p><u>\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435<\/u>: \u0435\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0432\u044b\u0434\u0430\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0443, \u0447\u0442\u043e \u043d\u0435\u0442 \u0442\u0430\u043a\u043e\u0433\u043e \u0442\u0438\u043f\u0430, \u043a\u0430\u043a ltree, \u0442\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u0443:<\/p>\n<p><code>create extension ltree<\/code><\/p>\n<\/li>\n<li>\n<p> \u041d\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438:<\/p>\n<pre><code>insert into transport values ('Transport', 'Transport'); insert into transport values ('Car', 'Transport.Car'); insert into transport values ('Truck', 'Transport.Car.Truck'); insert into transport values ('Van', 'Transport.Car.Van'); insert into transport values ('Sedan', 'Transport.Car.Sedan'); insert into transport values ('Boat', 'Transport.Boat'); insert into transport values ('Yacht', 'Transport.Boat.Yacht'); insert into transport values ('SailBoat', 'Transport.Boat.SailBoat'); insert into transport values ('Aircraft', 'Transport.AirCraft'); insert into transport values ('Helicopter', 'Transport.AirCraft.Helicopter'); insert into transport values ('Jet', 'Transport.AirCraft.Jet'); insert into transport values ('AirBus', 'Transport.AirCraft.AirBus');<\/code><\/pre>\n<\/li>\n<li>\n<p>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435:<\/p>\n<p>\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 &#8216;Transport.Car&#8217;:<\/p>\n<pre><code>select * from transport  where \"path\" &lt;@ 'Transport.Car'<\/code><\/pre>\n<p>\u00a0\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 &#8216;Transport.AirCraft.AirBus&#8217;:<\/p>\n<pre><code>select * from transport where \"path\" @> 'Transport.AirCraft.AirBus'<\/code><\/pre>\n<p>\u041a\u0430\u043a \u0432\u0438\u0434\u043d\u043e \u0438\u0437 \u043f\u0440\u0438\u043c\u0435\u0440\u0430, \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u0441\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0432 \u043d\u0435\u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043a \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<p>\u041e\u0431 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044f\u0445 Ltree Materialized Path \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c <a href=\"https:\/\/www.postgresql.org\/docs\/current\/ltree.html\">\u0432 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438.<\/a> <\/p>\n<\/li>\n<\/ol>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u0435\u0440\u0435\u0439\u0434\u0435\u043c \u043a \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044e \u043d\u0430\u0448\u0435\u0433\u043e \u0432\u0435\u0431-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0434\u0435\u0440\u0435\u0432\u043e\u043c \u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e\u043c API \u0438 Entity Framework Core.\u00a0<\/p>\n<h3>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442 ASP.NET Core Web API <\/h3>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442 \u0441 \u0442\u0438\u043f\u043e\u043c ASP.NET Core Web API \u0438 \u043d\u0430\u0437\u043e\u0432\u0435\u043c \u043d\u0430\u0448 \u043f\u0440\u043e\u0435\u043a\u0442 MaterializedPathAPI. <\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u0443\u0435\u043c \u043d\u0430\u0448 \u043f\u0440\u043e\u0435\u043a\u0442 \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u043c:   <\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c nuget \u043f\u0430\u043a\u0435\u0442\u044b:<\/p>\n<ol>\n<li>\n<p>Npgsql.EntityFrameworkCore.PostgreSQL.<\/p>\n<\/li>\n<li>\n<p>Microsoft.EntityFrameworkCore.Design.<\/p>\n<\/li>\n<li>\n<p>Microsoft.EntityFrameworkCore.Tools.<\/p>\n<\/li>\n<\/ol>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u043c\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0431\u0443\u0434\u0443\u0442:<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/github.com\/KhusravBim\/MaterializedPathTreeApi\/blob\/main\/Controllers\/TreeController.cs\">TreeController<\/a> \u2013 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0438\u0437\u0432\u043d\u0435 \u0441 \u043d\u0430\u0448\u0438\u043c API;<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/KhusravBim\/MaterializedPathTreeApi\/blob\/main\/TreeService.cs\">TreeService<\/a> \u2013 \u0441\u0435\u0440\u0432\u0438\u0441 \u0441 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043b\u043e\u0433\u0438\u043a\u043e\u0439;<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/KhusravBim\/MaterializedPathTreeApi\/blob\/main\/DB\/TreeContext.cs\">TreeContext<\/a> \u2013 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0438\u0439 EntityFrame Work Core;<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/KhusravBim\/MaterializedPathTreeApi\/blob\/main\/DB\/TreeRepository.cs\">TreeRepository<\/a> \u2013 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445.\u00a0 <\/p>\n<\/li>\n<\/ul>\n<h3>\u0417\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442 \u043d\u0443\u0436\u043d\u044b\u043c\u0438 \u043f\u0430\u043f\u043a\u0430\u043c\u0438 \u0438 \u0444\u0430\u0439\u043b\u0430\u043c\u0438<\/h3>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043f\u0430\u043f\u043a\u0443 DB \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043f\u0430\u043f\u043a\u0443 Models, \u0430 \u0432 \u043d\u0435\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u0434\u0435\u0440\u0435\u0432\u0430:<\/p>\n<ol>\n<li>\n<p><a href=\"https:\/\/github.com\/KhusravBim\/MaterializedPathTreeApi\/blob\/main\/DB\/Models\/Tree.cs\">Tree.cs.<\/a><\/p>\n<pre><code>public class Tree { \u00a0\u00a0\u00a0\u00a0[Key] \u00a0\u00a0\u00a0\u00a0[StringLength(50, MinimumLength = 3)] \u00a0\u00a0\u00a0\u00a0public Guid Id { get; set; }  \u00a0\u00a0\u00a0\u00a0[Required] \u00a0 \u00a0\u00a0[StringLength(50)] \u00a0\u00a0\u00a0\u00a0public string Name { get; set; }  \u00a0\u00a0\u00a0\u00a0[Required] \u00a0\u00a0\u00a0\u00a0[StringLength(5)] \u00a0\u00a0\u00a0\u00a0public string Sorting { get; set; } }<\/code><\/pre>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/KhusravBim\/MaterializedPathTreeApi\/blob\/main\/DB\/Models\/TreeItem.cs\">TreeItem.cs.<\/a> \u041a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b TreeItems \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0434\u0435\u0440\u0435\u0432\u0430. <\/p>\n<pre><code>[Index(nameof(EntityId))] [Index(nameof(ParentEntityId))] [Index(nameof(TreeKey))] [Index(nameof(MaterializedPath))] public class TreeItem { \u00a0\u00a0\u00a0\u00a0[Key] \u00a0\u00a0\u00a0\u00a0[DatabaseGenerated(DatabaseGeneratedOption.Identity)] \u00a0\u00a0\u00a0\u00a0public Guid Id { get; set; }  \u00a0\u00a0\u00a0\u00a0[Required] \u00a0\u00a0\u00a0\u00a0public Guid EntityId { get; set; } \u00a0 \u00a0\u00a0\u00a0\u00a0public Guid? ParentEntityId { get; set; }  \u00a0\u00a0\u00a0\u00a0[Required] \u00a0\u00a0\u00a0\u00a0public string EntityValue { get; set; }  \u00a0\u00a0\u00a0\u00a0[Column(TypeName = \"ltree\")] \u00a0\u00a0\u00a0\u00a0public LTree MaterializedPath { get; set; }   \u00a0 \u00a0public Guid TreeKey { get; set; }  \u00a0\u00a0\u00a0\u00a0[NotMapped] \u00a0\u00a0\u00a0\u00a0public int Level { get; set; } \/\/\u0434\u043b\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0443\u0440\u043e\u0432\u043d\u044f \u0438\u0437 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 MaterializedPath.Nlevel }<\/code><\/pre>\n<\/p>\n<\/li>\n<\/ol>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 <a href=\"https:\/\/github.com\/KhusravBim\/MaterializedPathTreeApi\/blob\/main\/DB\/TreeContext.cs\">TreeContext.cs<\/a> \u0432 \u043f\u0430\u043f\u043a\u0435 DB. \u0412 \u044d\u0442\u043e\u043c \u043a\u043b\u0430\u0441\u0441\u0435 \u0432 \u043c\u0435\u0442\u043e\u0434\u0435 OnModelCreating() \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0438\u043d\u0434\u0435\u043a\u0441 \u00abgist\u00bb \u043a \u0442\u0430\u0431\u043b\u0438\u0446\u0435 TreeItem \u0434\u043b\u044f \u0431\u043e\u043b\u0435\u0435 \u0443\u0434\u043e\u0431\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 LTree. \u041c\u044b \u0441\u043c\u043e\u0436\u0435\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043c\u0435\u0442\u043e\u0434\u0430\u043c\u0438 \u0438 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438 LTree, \u0430\u043d\u0430\u043b\u043e\u0433\u0430\u043c\u0438 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043d\u0430 PostgreSQL \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043d\u0438\u0436\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b:<\/p>\n<p><code>&lt;, &lt;=, =, >=, >, @>, &lt;@, @, ~, ? (\u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u0432 \u043e\u0444. \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438)<\/code><\/p>\n<pre><code>public class TreeContext : DbContext { \u00a0\u00a0\u00a0\u00a0public TreeContext(DbContextOptions&lt;TreeContext> options) : base(options) { } \u00a0\u00a0\u00a0\u00a0public DbSet&lt;Tree> Trees { get; set; } \u00a0\u00a0\u00a0\u00a0public DbSet&lt;TreeItem> TreeItems { get; set; }  \u00a0\u00a0\u00a0\u00a0protected override void OnModelCreating(ModelBuilder modelBuilder) \u00a0\u00a0\u00a0\u00a0{ \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0modelBuilder.HasPostgresExtension(\"ltree\"); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0base.OnModelCreating(modelBuilder); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0modelBuilder.Entity&lt;TreeItem>() \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.HasIndex(treeItem => treeItem.MaterializedPath) \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.HasMethod(\"gist\"); \/\/\u0442\u0443\u0442 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0438\u043d\u0434\u0435\u043a\u0441 gist \u0434\u043b\u044f \u0431\u043e\u043b\u0435\u0435 \u0443\u0434\u043e\u0431\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 Ltree \u00a0\u00a0\u00a0\u00a0} }<\/code><\/pre>\n<h3>\u041b\u043e\u0433\u0438\u043a\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0434\u0435\u0440\u0435\u0432\u0430<\/h3>\n<p>\u041f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u043d\u043e\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430, \u043f\u0435\u0440\u0432\u044b\u043c \u0434\u0435\u043b\u043e\u043c \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 MaterializedPath \u0435\u0433\u043e \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044f. \u0414\u0430\u043b\u0435\u0435 \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u043a\u043e\u043d\u043a\u0430\u0442\u0435\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e MaterializedPath \u0441\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 (EntityValue) \u0447\u0435\u0440\u0435\u0437 \u0442\u043e\u0447\u043a\u0443, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043f\u043e\u043b\u043d\u044b\u0439 \u043f\u0443\u0442\u044c \u043e\u0442 \u0432\u044b\u0448\u0435\u0441\u0442\u043e\u044f\u0449\u0438\u0445 \u043f\u043e \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u0438 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432. <\/p>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435 \u0435\u0441\u043b\u0438 \u0443 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0440\u0430\u0432\u043d\u043e \u201cfirst\u201d \u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u201csecond\u201d, \u0432 \u0438\u0442\u043e\u0433\u0435 \u0432 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0435 MaterialledPath \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u201cfist.second\u201d\u00a0<\/p>\n<pre><code>\/\/\u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0434\u043b\u044f \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f Materialized Path var parentTreeItem = await _context.TreeItems \u00a0\u00a0.Where(x => x.EntityId == treeItem.ParentEntityId) .FirstOrDefaultAsync();  \/\/\u041e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c Materialized Path \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 treeItem.MaterializedPath = \u00a0\u00a0\u00a0new LTree(parentTreeItem == null ? \u00a0\u00a0\u00a0\u00a0\u00a0GetPath(treeItem.EntityValue) : \u00a0\u00a0\u00a0\u00a0\u00a0ConcatPath(parentTreeItem.MaterializedPath, treeItem.EntityValue));<\/code><\/pre>\n<p>\u0414\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u0438 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043c\u0435\u0442\u043e\u0434\u0430\u043c\u0438 \u043a\u043b\u0430\u0441\u0441\u0430 Ltree:<\/p>\n<ol>\n<li>\n<p>\u041c\u0435\u0442\u043e\u0434 IsAncestorOf() \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0432 postgreSql \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0443 @> \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0432\u0441\u0435 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b. <\/p>\n<pre><code>var treeItem = await GetTreeItem(treeItemId);\u00a0 return await _context.TreeItems \u00a0\u00a0.Where(x => x.MaterializedPath.IsAncestorOf(treeItem.MaterializedPath));<\/code><\/pre>\n<\/li>\n<li>\n<p>\u041c\u0435\u0442\u043e\u0434 IsDescendantOf() \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0432 postgreSql \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0443 &lt;@ \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0432\u0441\u0435 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b.<\/p>\n<pre><code>var treeItem = await GetTreeItem(treeItemId);\u00a0 return await _context.TreeItems   .Where(x =>\u00a0x.MaterializedPath.IsDescendantOf(treeItem.MaterializedPath));<\/code><\/pre>\n<\/li>\n<\/ol>\n<p><u>\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435<\/u>: \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441\u043e \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e\u043c \u043a\u043b\u0430\u0441\u0441\u0430 TreeItem MaterializedPath (\u0442\u0438\u043f Ltree) \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c, \u0447\u0442\u043e \u0435\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u044b \u0438 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0434\u043e \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0441 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445. \u00a0<\/p>\n<p>\u0418\u0442\u0430\u043a, \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u043c. \u0421\u043e\u0437\u0434\u0430\u0435\u043c <a href=\"https:\/\/github.com\/KhusravBim\/MaterializedPathTreeApi\/blob\/main\/DB\/TreeRepository.cs\">TreeRepository.cs<\/a> \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043e\u043c \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043f\u0430\u043f\u043a\u0435 DB. \u0414\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0434\u0435\u0440\u0435\u0432\u0430 \u043d\u0430\u043c \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u044e\u0442\u0441\u044f:<\/p>\n<ul>\n<li>\n<p>\u043c\u0435\u0442\u043e\u0434 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043a\u043e\u0440\u043d\u044f \u0434\u0435\u0440\u0435\u0432\u0430 (\u0441\u0442\u0440. 16);<\/p>\n<\/li>\n<li>\n<p>\u043c\u0435\u0442\u043e\u0434 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 TreeItem (\u0441\u0442\u0440. 32);<\/p>\n<\/li>\n<li>\n<p>\u043c\u0435\u0442\u043e\u0434 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u0434\u0435\u0440\u0435\u0432\u0435 (\u0441\u0442\u0440. 59);<\/p>\n<\/li>\n<li>\n<p>\u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u0438 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 (\u0441\u0442\u0440. 116 \u0438 \u0441\u0442\u0440.139).<\/p>\n<\/li>\n<\/ul>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c <a href=\"https:\/\/github.com\/KhusravBim\/MaterializedPathTreeApi\/blob\/main\/TreeService.cs\">TreeService.cs<\/a> \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043b\u043e\u0433\u0438\u043a\u043e\u0439 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u043f\u0430\u043f\u043a\u0435. \u0414\u0430\u043d\u043d\u044b\u0439 \u0441\u0435\u0440\u0432\u0438\u0441 \u0431\u0443\u0434\u0435\u0442 \u0434\u043b\u044f \u043d\u0430\u0441 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u043c \u0437\u0432\u0435\u043d\u043e\u043c, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440.<\/p>\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0441\u0442\u0440\u043e\u043a\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a \u043d\u0430\u0448\u0435\u0439 \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 <a href=\"https:\/\/github.com\/KhusravBim\/MaterializedPathTreeApi\/blob\/main\/appsettings.json\">appsettings.json<\/a>:<\/p>\n<pre><code>\"ConnectionStrings\": { \u00a0\u00a0\u00a0\u00a0\"TreeConnection\": \"User ID=postgresUser;Password=postgresPW;Server=localhost;Port=5455;Database=postgres;Integrated Security=true;Pooling=true;\" }<\/code><\/pre>\n<p><strong>\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u0443\u0435\u043c \u043a\u043b\u0430\u0441\u0441 Program.<\/strong><\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u043d\u0435 \u0437\u0430\u043c\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0441 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435\u043c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432 \u0434\u043b\u044f\u00a0 dependency injection, \u0443\u0434\u0430\u043b\u0438\u043c app.UseAuthorization(), \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e \u0434\u043b\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a \u043d\u0430\u0448\u0435\u0439 \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 <a href=\"https:\/\/github.com\/KhusravBim\/MaterializedPathTreeApi\/blob\/main\/appsettings.json\">appsettings.json<\/a> \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0432 \u0441\u0435\u0440\u0432\u0438\u0441\u044b TreeRepository \u0438 TreeService:<\/p>\n<pre><code>var builder = WebApplication.CreateBuilder(args); builder.Services.AddControllers();<\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-337576","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/337576","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=337576"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/337576\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=337576"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=337576"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=337576"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}