比较IPAddress(存储为varbinary)

时间:2009-11-30 15:55:57

标签: c# linq linq-to-sql

我的Activity表上有一个IPAddress列。它存储为varbinary(16),因此它可以高效(比存储为字符串更多)并且还支持IPv6。当我存储时,我基本上得到(new System.Net.IPAddress(“127.0.0.1”))的值.GetAddressBytes()。

我希望能够做的是搜索以某些字节开头的所有IP地址,例如“127 *”。我可以很容易地得到那个字节,所以假设我能够得到新的byte [] {127}。

鉴于此,我怎样才能实际编写LINQ to SQL查询以获取我想要的数据?

可悲的是,我没有StartsWith,虽然我基本上想要相当于Activity.Where(a => a.IPAddress.StartsWith(new byte [] {127}))。

2 个答案:

答案 0 :(得分:4)

不久前,我必须找到给定IP的位置。我们从请求中获得了IP。有免费的数据库给了我们这个映射。在IPv4中,当我们将IP称为“a.b.c.d”时,它基本上就是......

a * (256^3) + b * (256^2) + c * (256) + d

http://www.aboutmyip.com/AboutMyXApp/IP2Integer.jsp

所以当你说你想要一个以“a”开头的IP地址时,你正在寻找a * 256 ^ 3和a * 256 ^ 3 + 256 *(256 ^ 2)(b = 256)+ 256之间的IP *(256)(c = 256)+ 256(d = 256)(下限/上限可能会略有不同,具体取决于您是否要包含/排除限制)。

也就是说,为特定目的保留了特定的IP(如127.0.0.1,即localhost,0.0.0.0不能是IP等)。

所以你的linq查询将是

from i in iList where i >= MIN && i <= MAX select i;

其中iList是您的初始列表 MIN是您的范围的最小值 MAX是您的范围的最大值

答案 1 :(得分:2)

如果数据作为字节数组返回,为什么不引用数组的第一个字节?听起来像;

Activity.Where(a => a.IpAddress[0] == 127);

可能是你想要的?

您可以将IP地址存储为十六进制字符串,其中127.0.0.1 =“7F000001”然后如果要查找以192.168开头的IP地址。*您可以使用

Activity.Where(a => a.IpAddress.StartsWith("C0A8"));