Certainly, here's an updated version of the `GetNeighbors` method that returns the metadata and shapefiles for each neighbor shape:
```csharp
using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Web.Http;
using Newtonsoft.Json.Linq;

namespace YourNamespace
{
    public class ShapefileController : ApiController
    {
        [HttpGet]
        public IHttpActionResult GetNeighbors(int id)
        {
            List<JObject> neighbors = new List<JObject>();

            // Get the geometry for the given ID
            using (SqlConnection connection = new SqlConnection("YOUR_CONNECTION_STRING_HERE"))
            {
                connection.Open();

                string query = "SELECT id, meta_data, shape FROM shapes WHERE id = @id";
                SqlCommand command = new SqlCommand(query, connection);
                command.Parameters.AddWithValue("@id", id);

                SqlDataReader reader = command.ExecuteReader();

                if (reader.Read())
                {
                    // Convert the geometry to a SqlGeometry object
                    int shapeId = reader.GetInt32(0);
                    string metaData = reader.GetString(1);
                    string shapeString = reader.GetString(2);
                    var shape = Microsoft.SqlServer.Types.SqlGeometry.STGeomFromText(new System.Data.SqlTypes.SqlChars(shapeString), 4326);

                    // Get all shapes that intersect with the given geometry
                    query = "SELECT id, meta_data, shape FROM shapes WHERE id <> @id AND shape.STIntersects(@shape) = 1";
                    command = new SqlCommand(query, connection);
                    command.Parameters.AddWithValue("@id", id);
                    command.Parameters.AddWithValue("@shape", shape);

                    reader.Close();
                    reader = command.ExecuteReader();

                    while (reader.Read())
                    {
                        // Check if the shapes share a common boundary
                        int neighborId = reader.GetInt32(0);
                        string neighborMetaData = reader.GetString(1);
                        string neighborShapeString = reader.GetString(2);
                        var neighborShape = Microsoft.SqlServer.Types.SqlGeometry.STGeomFromText(new System.Data.SqlTypes.SqlChars(neighborShapeString), 4326);

                        if (shape.STTouches(neighborShape))
                        {
                            JObject neighbor = new JObject();
                            neighbor["id"] = neighborId;
                            neighbor["meta_data"] = JObject.Parse(neighborMetaData);
                            neighbor["shape"] = neighborShapeString;
                            neighbors.Add(neighbor);
                        }
                    }
                }
            }

            // Return the list of neighbor shapes
            return Json(neighbors);
        }
    }
}
```
In this updated version of the `GetNeighbors` method, the code now retrieves the metadata and shapefiles for each neighbor shape, and returns them as a list of JSON objects. Each object in the list contains the ID, metadata, and shapefile for a single neighbor shape.

The JSON response from the method might look something like this:
```json
[
    {
        "id": 1,
        "meta_data": {
            "name": "Neighbor 1",
            "description": "This is the first neighbor"
        },
        "shape": "POLYGON ((-77.038544 38.896065, -77.038544 38.899145, -77.033435 38.899145, -77.033435 38.896065, -77.038544 38.896065))"
    },
    {
        "id": 3,
        "meta_data": {
            "name": "Neighbor 3",
            "description": "This is the third neighbor"
        },
        "shape": "POLYGON ((-77.033435 38.896065, -77.033435 38.899145, -77.028326 38.899145, -77.028326 38.896065, -77.033435 38
```
확실히 다음은 각 이웃 도형의 메타데이터와 모양 파일을 반환하는 `GetNeighbors` 메서드의 업데이트 버전입니다:
```csharp
using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Web.Http;
using Newtonsoft.Json.Linq;

네임스페이스 YourNamespace
{
    public class ShapefileController : ApiController
    {
        [HttpGet]
        public IHttpActionResult GetNeighbors(int id)
        {
            List<JObject> neighbors = new List<JObject>();

            // 주어진 ID에 대한 지오메트리를 가져옵니다.
            사용 (SqlConnection connection = new SqlConnection("YOUR_CONNECTION_STRING_HERE"))
            {
                connection.Open();

                문자열 쿼리 = "SELECT id, meta_data, shape FROM shapes WHERE id = @id";
                SqlCommand command = 새로운 SqlCommand(쿼리, 연결);
                command.Parameters.AddWithValue("@id", id);

                SqlDataReader reader = command.ExecuteReader();

                if (reader.Read())
                {
                    // 지오메트리를 SqlGeometry 객체로 변환합니다.
                    int shapeId = reader.GetInt32(0);
                    문자열 메타데이터 = reader.GetString(1);
                    문자열 shapeString = reader.GetString(2);
                    var shape = Microsoft.SqlServer.Types.SqlGeometry.STGeomFromText(new System.Data.SqlTypes.SqlChars(shapeString), 4326);

                    // 주어진 지오메트리와 교차하는 모든 도형을 가져옵니다.
                    query = "SELECT id, meta_data, shape FROM shapes WHERE id <> @id AND shape.STIntersects(@shape) = 1";
                    command = 새로운 SqlCommand(쿼리, 연결);
                    command.Parameters.AddWithValue("@id", id);
                    command.Parameters.AddWithValue("@shape", shape);

                    reader.Close();
                    reader = command.ExecuteReader();

                    while (reader.Read())
                    {
                        // 도형이 공통 경계를 공유하는지 확인합니다.
                        int neighborId = reader.GetInt32(0);
                        string neighborMetaData = reader.GetString(1);
                        string neighborShapeString = reader.GetString(2);
                        var neighborShape = Microsoft.SqlServer.Types.SqlGeometry.STGeomFromText(new System.Data.SqlTypes.SqlChars(neighborShapeString), 4326);

                        if (shape.STTouches(neighborShape))
                        {
                            JObject neighbor = new JObject();
                            neighbor["id"] = neighborId;
                            neighbor["meta_data"] = JObject.Parse(neighborMetaData);
                            neighbor["shape"] = neighborShapeString;
                            이웃.추가(이웃);
                        }
                    }
                }
            }

            // 이웃 도형 목록을 반환합니다.
            반환 Json(이웃);
        }
    }
}
```
이 업데이트된 버전의 `GetNeighbors` 메서드에서는 이제 코드가 각 이웃 도형에 대한 메타데이터와 셰이프파일을 검색하여 JSON 객체 목록으로 반환합니다. 목록의 각 객체에는 단일 이웃 도형에 대한 ID, 메타데이터 및 셰이프 파일이 포함됩니다.

메서드의 JSON 응답은 다음과 같이 보일 수 있습니다:
```json
[
    {
        "id": 1,
        "메타_데이터": {
            "name": "이웃 1",
            "설명": "이것은 첫 번째 이웃입니다"
        },
        "모양": "다각형 ((-77.038544 38.896065, -77.038544 38.899145, -77.033435 38.899145, -77.033435 38.896065, -77.038544 38.896065))"
    },
    {
        "id": 3,
        "meta_data": {
            "name": "이웃 3",
            "설명": "이것은 세 번째 이웃입니다"
        },
        "모양": "polygon ((-77.033435 38.896065, -77.033435 38.899145, -77.028326 38.899145, -77.028326 38.896065, -77.033435 38
```