一段用于地址清洗的代码

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);
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值