Linq. Как запросить список в списке? - PullRequest
2 голосов
/ 06 декабря 2011

У меня есть объект Store List (storeList).(Состоит из списка магазинов) Каждый магазин имеет список адресов.Каждый адрес имеет свойство AddressType, которое может быть PHYSICAL, ALTERNATIVE или MAILING.

Я пытаюсь вернуть объект PHYSICAL Address, чтобы я мог изменить его свойства:

Это моя первая попытка:

StoreAddressList result = 
    (from str in storeList
     where
     str.AssetAddresses.Any(p => p.AddressType.Name == "PHYSICAL")
     select str.AssetAddresses).FirstOrDefault();

В результате я ожидаю получить список только с одним элементом (где тип адреса - ФИЗИЧЕСКИЙ), но я получаю список с 3 элементами (со всеми тремя типами).Что здесь не так?

Спасибо

Ответы [ 2 ]

9 голосов
/ 06 декабря 2011

Выровняйте список адресов, проецируя каждое хранилище на свой список адресов, используйте SelectMany для достижения выравнивания, а затем выберите только те, для которых тип адреса является физическим:

var addressesToModify = 
    storeList.SelectMany(store => store.AssetAddresses)
             .Where(address => address.AddressType.Name == "PHYSICAL");

В синтаксисе запроса:

var addressesToModify =
    from store in storeList
    from address in store.AssetAddresses
    where address.AddressType.Name == "PHYSICAL"
    select address;

Обратите внимание, как это выглядит так, как мы описали. Из каждого store в storeList, из каждого address в store.AssetAddresses, где address является физическим адресом, выберите address.

Теперь повторяйте результаты запроса и изменяйте по мере необходимости.

Кроме того, я настоятельно рекомендую сделать перечисление

public enum AddressType { Physical, Alternative, Mailing }

и изменение Address.AddressType на этот тип

public AddressType AddressType { get; }

и тогда вы можете написать

where address.AddressType == AddressType.Physical

или

.Where(address => address.AddressType == AddressType.Physical);
2 голосов
/ 06 декабря 2011

Вам нужно использовать SelectMany для выравнивания списка адресов.

var result =
  storeList
  .SelectMany(store => store.AssetAddress)
  .Where(address => address.AddressType == "PHYSICAL")
  .FirstOrDefault();

Я предполагаю, что в списке storeList также будет where, чтобы вы могли получить только адрес интересующего вас магазина.

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