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

时间:2011-12-06 16:21:46

标签: linq entity-framework lambda

我有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个项目的列表(所有三种类型)。这有什么不对?

由于

2 个答案:

答案 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中的每个storeListaddress 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,这样你才能获得你感兴趣的商店的地址。