Сравнение IP-адреса (хранится как varbinary) - PullRequest
1 голос
/ 30 ноября 2009

В моей таблице активности есть столбец IP-адрес. Он хранится в виде varbinary (16), поэтому он может быть эффективен (более того, храниться в виде строки) и также поддерживать IPv6. Когда я сохраняю, я в основном получаю значение (new System.Net.IPAddress ("127.0.0.1")). GetAddressBytes ().

То, что я хочу сделать, это поиск всех IP-адресов, которые начинаются с определенных байтов, например, "127. *". Я могу легко получить байты для этого, поэтому предположим, что я могу получить новый байт [] {127}.

Учитывая это, как я могу написать запрос LINQ to SQL, чтобы получить нужные мне данные?

К сожалению, у меня нет StartsWith, хотя я, по сути, хочу эквивалент Activity.Where (a => a.IPAddress.StartsWith (new byte [] {127})).

Ответы [ 2 ]

4 голосов
/ 30 ноября 2009

Некоторое время назад мне нужно было найти местоположение данного IP. Мы получили IP из запроса. Есть бесплатные базы данных, которые дали нам это отображение. В IPv4, когда мы говорим IP как «a.b.c.d», это по существу ......

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

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

поэтому, когда вы говорите, что хотите, чтобы IP-адрес начинался с «a», вы ищете 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 - ваше минимальное значение для вашего диапазона МАКС - ваше максимальное значение для вашего диапазона

2 голосов
/ 30 ноября 2009

Если данные возвращаются в виде байтового массива, почему бы не обратиться к первому байту массива? Звучит как;

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

может быть то, что вы ищете?

Вы можете сохранить IP-адрес в виде шестнадцатеричной строки, где 127.0.0.1 = "7F000001", тогда, если вы хотите найти IP-адрес, начинающийся с 192.168. * Вы можете использовать

Activity.Where(a => a.IpAddress.StartsWith("C0A8"));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...