【问题标题】:Linq. How to query list within list?林克。如何在列表中查询列表?
【发布时间】:2011-12-06 16:21:46
【问题描述】:

我有商店列表 (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 项的列表(包含所有三种类型)。这里有什么问题?

谢谢

【问题讨论】:

  • 您要选择什么?看起来您正在尝试选择列表中任何地址类型等于“物理”的第一个商店。对吗?

标签: linq entity-framework lambda


【解决方案1】:

通过将每个store投影到其地址列表中来扁平化地址列表列表,使用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 是物理地址,选择address

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

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

public enum AddressType { Physical, Alternative, Mailing }

并将Address.AddressType 更改为这种类型

public AddressType AddressType { get; }

然后你就可以写了

where address.AddressType == AddressType.Physical

.Where(address => address.AddressType == AddressType.Physical);

【讨论】:

  • :-)。你很快。非常感谢。
【解决方案2】:

您需要使用SelectMany 来平整地址列表。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多