Сильный запрос вложенного списка - PullRequest
0 голосов
/ 30 апреля 2018

У меня есть 3 класса POCO, как показано ниже;

Континент имеет много ContinentPart

Континент имеет много стран

В стране много городов

Я хочу получить Континенты с Континент-частями, странами и городами

using (IDbConnection db = new SqlConnection(_conf["ConnectionStrings:WorkConStr"]))
            {
                string query = @"SELECT * FROM Continent as c
                                LEFT JOIN ContinentPart as cp ON c.ContinentId=cp.ContinentId
                                LEFT JOIN Country as co ON c.ContinentId=co.ContinentId
                                LEFT JOIN City ci ON co.CountryId=ci.CountryId
                                ORDER BY c.RecDate DESC";

                var continentDictionary = new Dictionary<int, Continent>();
                var list = db.Query<Continent, ContinentPart, Country, City, Continent>(
                    query,
                    map: (continent, continentPart, country, city) =>
                     {
                         Continent m;
                         if (!continentDictionary.TryGetValue(continent.ContinentId, out m))
                         {
                             continentDictionary.Add(continent.ContinentId, m = continent);
                         }
                         if (m.ContinentParts == null)
                             m.ContinentParts = new List<ContinentPart>();
                         m.ContinentParts.Add(continentPart);
                         if (m.Countries == null)
                             m.Countries = new List<Country>();
                         m.Countries.Add(country);
                         foreach (var h in m.Countries)
                         {
                             if (h.Cities == null)
                                 h.Cities = new List<City>();
                             h.Cities.Add(city);
                         }
                         return m;
                     },
                    param: new { },
                    splitOn: "")
                    .Distinct()
                    .ToList();
                return list;
            }

1 Ответ

0 голосов
/ 30 апреля 2018

У вас есть два варианта здесь. Вы можете использовать функцию нескольких наборов результатов:

https://medium.com/dapper-net/handling-multiple-resultsets-4b108a8c5172

Или другой вариант, который, на мой взгляд, лучше вернуть объединенный результат в виде JSON, например, с помощью запроса, подобного следующему:

select 
    continents.continent_id,
    continents.continent,
    countries.country_id,
    countries.country,
    cities.city_id,
    cities.city 
from 
    dbo.Continent continents
inner join 
    dbo.Country countries on continents.continent_id = countries.continent_id
inner join
    dbo.City cities on countries.country_id = cities.country_id
for 
    json auto

, который возвращает JSON вроде этого:

{
    "continent_id": 1,
    "continent": "Africa",
    "countries":
    [
        {
            "country_id": 1,
            "country": "Nigeria",
            "cities":           
            [   
                {
                    "city_id": 1,
                    "city": "Lagos"
                }, {
                    "city_id": 2,
                    "city": "Abuja"
                }
            ]
        }
    ]
}

и затем его можно превратить в сложный объект с помощью пользовательской обработки типов:

https://medium.com/dapper-net/custom-type-handling-4b447b97c620

Ссылки на статьи, которые я написал на эту тему.

...