我有商店列表(storeList)对象。 (由商店列表组成) 每个商店都有地址列表。每个地址都有 AddressType 属性,可以是 PHYSICAL、ALTERNATIVE 或 MAILING。
我正在尝试返回物理地址对象,以便我可以修改其属性:
这是我的第一次尝试:
StoreAddressList result =
(from str in storeList
where
str.AssetAddresses.Any(p => p.AddressType.Name == "PHYSICAL")
select str.AssetAddresses).FirstOrDefault();
因此,我希望获得仅包含一项的列表(其中地址类型为物理),但我得到包含 3 个项目的列表(具有所有三种类型)。这里出了什么问题?
谢谢
最佳答案
通过将每个商店投影到其地址列表来展平地址列表,使用 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;
请注意它的读法与我们所描述的完全一样。来自 storeList
中的每个 store
,来自 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);
关于林克。如何查询列表中的列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8403232/