using (var context = new Entities())
{
// 使用前2个字符中匹配省级行政区划
var provs = context.region.Where(r => r.Grade == 0);
var prov = provs.SingleOrDefault(p => p.Alias.Contains(address.Substring(0, 2)));
region city;
if (prov == null)
{
// 省级区划未知时,尝试使用前四个字符进行市级行政区划反向查询
city = (from c in context.region.Where(r => r.Grade == 1 && address.Substring(0, 4).Contains(r.Alias))
let index = address.IndexOf(c.Alias, StringComparison.OrdinalIgnoreCase)
where index >= 0
orderby index
select c).FirstOrDefault();
if (city == null) return result.BadRequest();
prov = context.region.Single(r => r.ID == city.ParentId);
}
else
{
// 在已知的省级区划中匹配市级行政区划
city = (from c in context.region.Where(r => r.ParentId == prov.ID)
let index = address.IndexOf(c.Alias, StringComparison.OrdinalIgnoreCase)
where index >= 0
orderby index
select c).FirstOrDefault();
}
region county;
if (city == null)
{
// 市级区划未知时,在已知的省级区划中尝试使用县级行政区划反向查询
var citys = context.region.Where(r => r.ParentId == prov.ID);
county = (from c in context.region.Where(r => citys.Any(c => c.ID == r.ParentId))
let index = address.IndexOf(c.Alias, StringComparison.OrdinalIgnoreCase)
where index >= 0
orderby index
select c).FirstOrDefault();
if (county == null) return result.BadRequest();
city = context.region.Single(r => r.ID == county.ParentId);
}
else
{
// 在已知的市级区划中匹配县级行政区划
county = (from c in context.region.Where(r => r.ParentId == city.ID)
let index = address.IndexOf(c.Alias, StringComparison.OrdinalIgnoreCase)
where index >= 0
orderby index
select c).FirstOrDefault();
}
// 移除省市县三级行政区划字符串
var idx = address.IndexOf(county == null ? city.Alias : county.Alias, StringComparison.OrdinalIgnoreCase);
var street = address.Substring(idx).Replace(county == null ? city.Name : county.Name, "");
var region = new Address
{
Prov = prov.Name,
City = city.Name,
County = county?.Name,
Street = street
};
return result.Success(region);
}