我有一个包含城市的嵌套模型国家。城市有带区的区。我可以从客户端获取数据作为嵌套模型。所以我想选择一个祖先如国家,城市和地区的区域。我不想使用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();
上面的代码仅用于获取城市及其地区和祖先。错误在这里:
“我在当前上下文中不存在。”
答案 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();