LINQ.如何在列表中查询列表?

bob*_*tko 3 linq lambda entity-framework

我有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();
Run Code Online (Sandbox Code Playgroud)

因此,我希望获得只有一个项目的列表(地址类型为PHYSICAL),但我得到3个项目的列表(所有三种类型).这有什么不对?

谢谢

jas*_*son 10

通过将每个商店投影到其地址列表SelectMany来平整地址列表,用于实现展平,然后仅采用地址类型为物理的地址:

var addressesToModify = 
    storeList.SelectMany(store => store.AssetAddresses)
             .Where(address => address.AddressType.Name == "PHYSICAL");
Run Code Online (Sandbox Code Playgroud)

在查询语法中:

var addressesToModify =
    from store in storeList
    from address in store.AssetAddresses
    where address.AddressType.Name == "PHYSICAL"
    select address;
Run Code Online (Sandbox Code Playgroud)

注意它的读取方式与我们描述的完全一致 从每个storestoreList,每个addressstore.AssetAddresses哪里address是物理地址,选择address.

现在迭代查询结果并根据需要进行修改.

另外,我强烈建议制作一个枚举

public enum AddressType { Physical, Alternative, Mailing }
Run Code Online (Sandbox Code Playgroud)

并改为Address.AddressType这种类型

public AddressType AddressType { get; }
Run Code Online (Sandbox Code Playgroud)

然后你就可以写了

where address.AddressType == AddressType.Physical
Run Code Online (Sandbox Code Playgroud)

要么

.Where(address => address.AddressType == AddressType.Physical);
Run Code Online (Sandbox Code Playgroud)