我有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();
结果我希望得到只有一个项目的列表(地址类型为PHYSICAL),但我得到3个项目的列表(所有三种类型)。这有什么不对?
由于
答案 0 :(得分:9)
通过将每个商店投影到其地址列表来展平地址列表列表,使用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);
或
{{1}}
答案 1 :(得分:2)
您需要使用SelectMany
来平坦地址列表。
var result =
storeList
.SelectMany(store => store.AssetAddress)
.Where(address => address.AddressType == "PHYSICAL")
.FirstOrDefault();
我猜测storeList上还会有一个where
,这样你才能获得你感兴趣的商店的地址。