比较IPAddress(存储为varbinary)

我的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}))。

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

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

可能是你在找什么?

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

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

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

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

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

所以当你说你想要一个以“a”开头的IP地址时,你正在寻找一个* 256 ^ 3和一个* 256 ^ 3 + 256 *(256 ^ 2)(b = 256)+ 256 *(256)之间的IP )(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是您的范围的最大值