如何使用LINQ根据目标IP查询数据库中对应IP段的所属国家?
基于LINQ实现IP网段匹配查询国家
问题场景
数据库中IP地址以CIDR网段格式(如123.123.123.0/16)存储,需根据目标IP123.124.11.25查询其所属网段对应的国家。原直接字符串匹配的LINQ代码无法实现网段匹配,需编写正确的网段判断逻辑。
现有数据集:
| IP | Country |
|---|---|
| 123.123.123.0/16 | A |
| 123.124.0.0/20 | B |
| 123.255.1.0/100 | C |
| 123.255.1.101/255 | D |
解决方案
首先实现两个辅助方法:将IP字符串转换为无符号整数,以及判断目标IP是否属于指定CIDR网段。
辅助方法代码
// 将IP字符串转换为UInt32 private static uint ConvertIpToUInt32(string ipAddress) { var ipBytes = System.Net.IPAddress.Parse(ipAddress).GetAddressBytes(); if (BitConverter.IsLittleEndian) Array.Reverse(ipBytes); return BitConverter.ToUInt32(ipBytes, 0); } // 判断目标IP是否在CIDR网段内 private static bool IsIpInCidr(string targetIp, string cidr) { var parts = cidr.Split('/'); if (parts.Length != 2) return false; var networkIp = parts[0]; if (!int.TryParse(parts[1], out int prefixLength)) return false; // 过滤IPv4无效前缀长度(合法范围0-32) if (prefixLength < 0 || prefixLength > 32) return false; var targetIpUInt = ConvertIpToUInt32(targetIp); var networkIpUInt = ConvertIpToUInt32(networkIp); var mask = prefixLength == 0 ? 0 : uint.MaxValue << (32 - prefixLength); return (targetIpUInt & mask) == (networkIpUInt & mask); }
最终LINQ查询代码
string IpCheck = "123.124.11.25"; string country = data.Where(i => IsIpInCidr(IpCheck, i.IP)) .Select(c => c.Country) .FirstOrDefault();
结果验证
执行上述代码后,目标IP123.124.11.25会匹配到网段123.124.0.0/20,返回对应的国家B。
内容的提问来源于stack exchange,提问作者ioxoi
相关产品推荐
相关产品推荐

