我的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}))。
答案 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"));