You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用LINQ根据目标IP查询数据库中对应IP段的所属国家?

基于LINQ实现IP网段匹配查询国家

问题场景

数据库中IP地址以CIDR网段格式(如123.123.123.0/16)存储,需根据目标IP123.124.11.25查询其所属网段对应的国家。原直接字符串匹配的LINQ代码无法实现网段匹配,需编写正确的网段判断逻辑。

现有数据集:

IPCountry
123.123.123.0/16A
123.124.0.0/20B
123.255.1.0/100C
123.255.1.101/255D

解决方案

首先实现两个辅助方法:将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 08:37:33