Linq 林克。如何在列表中查询列表?

Linq 林克。如何在列表中查询列表?,linq,entity-framework,lambda,Linq,Entity Framework,Lambda,我有storeList(storeList)对象。(由门店列表组成) 每个商店都有地址列表。每个地址都有AddressType属性,可以是物理地址、备选地址或邮寄地址 我正在尝试返回物理地址对象,以便修改其属性: 这是我第一次尝试: StoreAddressList result = (from str in storeList where str.AssetAddresses.Any(p => p.AddressType.Name == "PHYSICAL"

我有storeList(storeList)对象。(由门店列表组成) 每个商店都有地址列表。每个地址都有AddressType属性,可以是物理地址、备选地址或邮寄地址

我正在尝试返回物理地址对象,以便修改其属性:

这是我第一次尝试:

StoreAddressList result = 
    (from str in storeList
     where
     str.AssetAddresses.Any(p => p.AddressType.Name == "PHYSICAL")
     select str.AssetAddresses).FirstOrDefault();
因此,我希望得到只有一个项目的列表(地址类型是物理的),但我得到的列表有三个项目(所有三种类型)。这里怎么了


谢谢

通过将每个门店投影到其地址列表来展平地址列表,使用
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;
注意它的读法和我们描述的一模一样。从
存储列表中的每个
存储
,从
存储中的每个
地址
。如果
地址
是物理地址,请选择
地址

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

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

public enum AddressType { Physical, Alternative, Mailing }
并将
Address.AddressType
更改为此类型

public AddressType AddressType { get; }
然后你就可以写了

where address.AddressType == AddressType.Physical


您需要使用
SelectMany
来修饰地址列表

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

我猜商店列表上也会有一个
where
,这样你就只能得到你感兴趣的商店的地址。

你想选择什么?看起来您正在尝试选择列表中第一个地址类型等于“物理”的存储。对吗?:-)。你跑得很快。谢谢。
var result =
  storeList
  .SelectMany(store => store.AssetAddress)
  .Where(address => address.AddressType == "PHYSICAL")
  .FirstOrDefault();