我的活动表上有一个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}))。
前一段时间,我不得不找到给定IP的位置。我们从请求中获得了IP。有免费的数据库为我们提供了这种映射。在IPv4中,当我们说IP为“ abcd”时,它实际上是……
a * (256^3) + b * (256^2) + c * (256) + d
http://www.aboutmyip.com/AboutMyXApp/IP2Integer.jsp
因此,当您说要以“ a”开头的IP地址时,您正在寻找的IP地址介于* 256 ^ 3和* 256 ^ 3 + 256 *(256 ^ 2)(b = 256)+ 256 *(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是您的范围的最大值