Entity Framework запрос со списком - PullRequest
1 голос
/ 08 ноября 2019

Я получил адресную колонку с varchars в базе данных, которая выглядит следующим образом:

Elmstreet / 12345 / USA

Содержит улицу, почтовый индекс и страну. К сожалению, это существующая база данных, и я не могу вносить в нее какие-либо изменения. Так что теперь мне нужен набор результатов на основе списка почтовых индексов.

Самый простой способ получить это:

string postalCode = "12345";
addresses = addresses.Where(x => x.Address.Contains(postalCode));

Но так как у меня есть список почтовых индексов, я сделал это:

addresses = addresses.Where(x => postalCodes.Contains(x.Address));

Но я нене получить никаких результатов. И это очевидно после размышления о том, что делает код.

Я думал о работе с дополнительным списком, в который я бы добавил отдельные результаты с циклом foreach через список почтовых индексов.

Но, может быть, есть более простой и лучший способ сделать это?

Большое спасибо.

Ответы [ 2 ]

2 голосов
/ 08 ноября 2019
addresses = addresses.Where(x => postalCodes.Contains(x.Address));

То, что вы спросили здесь (как вы обнаружили), состоит в том, содержит ли список почтовых индексов весь этот адрес. Но это не то, что вам нужно.

Вам нужно проверить, можно ли найти какой-либо почтовый индекс в адресе и получить только адреса, для которых это действительно так. Работает следующий подход:

addresses = addresses.Where(x => 
                          postalCodes.Any(postalCode =>
                              x.Address.Contains(postalCode)
                          )
                      );

Чтобы выразить это словами: дайте мне все адреса, в которых строка адреса содержит любой этих почтовых кодов .


В качестве отступления:

Имейте в виду, что есть ложные срабатывания, например, если у вас есть почтовый индекс 1234 и у вас есть адреса с почтовым индексом 12345, вы собираетесьчтобы получить конфликты. Один из способов избежать этого - включить в свой почтовый индекс разделитель / из поля адреса:

postalCodes = postalCodes.Select(pc => $"/ {pc} /");

// and then the rest of the code as before

Это предотвратит большинство (если не все) ложных срабатываний.

1 голос
/ 08 ноября 2019

Предполагая, что это ваша структура списка адресов:

var addresses = new List<string>
{
  "Elmstreet / 12345 / USA",
  "Hollywood / 67890 / USA",
  "Time Square / 77777 / USA"
}

и ваш список postalCodes:

var postalCodes = new List<string>
{
  "12345",
  "77777"
}

Используйте LINQ. Любой метод:

var result = addresses.Where(a => postalCodes.Any(p => a.Contains(p))).ToList();

И результат будет:

foreach (var item in result) 
{
  Console.WriteLine(item);
}

, что должно дать:

Elmstreet / 12345 / USA
Time Square / 77777 / USA
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...