如何在C#中选择带有祖先的嵌套列表?

时间:2019-07-08 09:00:32

标签: c# linq

我有一个包含城市的嵌套模型国家。城市有带区的区。我可以从客户端获取数据作为嵌套模型。所以我想选择一个祖先如国家,城市和地区的区域。我不想使用4 * foreach设置区域实体。因为,我需要遍历各个国家,然后遍历其城市,然后遍历其地区,最后遍历其区域来进行设置。这些方法增加了“时间复杂度”。因此,如何使用以下响应模型设置区域实体。

以下是响应模型

    {
   "Id":"208",
   "Name":"Türkiye",
   "Cities":[
      {
         "Id":"1",
         "Name":"Adana",
         "Districts":[
            {
               "Id":"1",
               "Name":"Aladağ",
               "Zones":[
                  {
                     "Id":"1",
                     "Name":"Merkez"
                  }
               ]
            },
            {
               "Id":"2",
               "Name":"Baraj Yolu",
               "Zones":[
                  {
                     "Id":"3",
                     "Name":"Merkez"
                  },
                  {
                     "Id":"2",
                     "Name":"Beyazevler Mah."
                  }
               ]
            }
         ]
      }
   ]
}

以下是MongoDb上的数据模型。

 public class Countries {
    public string Name { get; set; }
    public string Id { get; set; }
    public int? Order { get; set; }     
    public string FlagImage { get; set; }
    public List<Cities> Cities { get; set; }
}


public class Cities{
    public string Id { get; set; }
    public string CountryId { get; set; }
    public string CountryName { get; set; }
    public string Name { get; set; }       
    public int? Order { get; set; }
    public List<Districts> Districts { get; set; }
}

public class Districts
{
    public string Id { get; set; }
    public string Name { get; set; }
    public string CountryId { get; set; }
    public string CountryName { get; set; }
    public string CityId { get; set; }
    public string CityName { get; set; }
    public List<Zones> Zones { get; set; }
}

 public class Zones
{
    public string Id { get; set; }
    public string Name { get; set; }
    public string CountryId { get; set; }
    public string CountryName { get; set; }
    public string CityId { get; set; }
    public string CityName { get; set; }
    public string DistrictId { get; set; }
    public string DistrictName { get; set; }
}

var newCities = response.Data.Where(i =>i.Cities != null)
                                         .SelectMany(i => i.Cities)
                                         .Select(a => new
                                            {
                                                CountryId = i.Id,
                                                CountryName = a.Name,
                                                Districts= a.Districts
                                            }).ToList();

上面的代码仅用于获取城市及其地区和祖先。错误在这里:

  

“我在当前上下文中不存在。”

2 个答案:

答案 0 :(得分:0)

假设数据是一个国家/地区的IEnumerable(请根据变量的名称命名变量,以使代码更易于理解)

此外,在linq表达式的匿名部分中,您同时使用'i'和'a'。在那里只能使用“ a”(城市)。

尝试下面的linq表达式,并在需要的地方进一步扩展,这将使您朝着正确的方向前进。

response
.Data
.Where(country => country.Cities != null && country.Cities.Any())
.SelectMany(country => country.Cities)
.Select(city => new {
  CountryId = city.CountryId,
  CountryName = city.CountryName,
  Districts = city.Districts
}).ToList();

从您最初的问题出发,对我来说,要在结果集中确切显示什么是不清楚的,尤其是Cities = a.Districts行非常令人困惑。

编辑(在原始问题中发布结果集json后)。

使用SelectMany的重载,您可以在其中使用匿名选择器方法同时引用国家和城市:

response
.Data
.Where(country => country.Cities != null && country.Cities.Any())
.SelectMany(country => country.Cities, (country, city) => new {
  CountryId = country.Id,
  CountryName = country.Name,
  Districts = city.Districts
}).ToList();

答案 1 :(得分:0)

如果认为您的代码还有更多要验证的内容,但是“我在当前上下文中不存在”问题。应该像下面这样解决:

var newCities = response.Data.Where(i =>i.Cities != null)
                                         .SelectMany(x => x.Cities)
                                         .Select(a => new
                                            {
                                                CountryId = a.Id,
                                                CountryName = a.Name,
                                                Cities = a.Districts
                                            }).ToList();