2011-12-06 24 views
2

我有Store List(storeList)對象。 (由商店列表組成) 每個商店都有地址列表。每個地址都有AddressType屬性,可以是PHYSICAL,ALTERNATIVE或MAILING。Linq。如何查詢列表中的列表?

我試圖返回物理地址的對象,所以我可以修改它的屬性:

這是我第一次嘗試:

StoreAddressList result = 
    (from str in storeList 
    where 
    str.AssetAddresses.Any(p => p.AddressType.Name == "PHYSICAL") 
    select str.AssetAddresses).FirstOrDefault(); 

因此,我希望得到清單,只有一個項目(其中地址類型是PHYSICAL),但我得到3個項目的列表(所有三種類型)。這裏有什麼問題?

由於

+0

什麼是你想選擇的地址?看起來您正試圖選擇列表中的第一個商店,其中的任何地址類型都等於「PHYSICAL」。那是對的嗎? – ken

回答

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; 

注意它是如何讀取酷似我們描述。從storeList中的每個store,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); 
+0

:-)。你很快。非常感謝。 – bobetko

2

您需要使用SelectMany來扁平化地址列表。

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

我猜還會有對storeList一個where,使你只能得到你感興趣的商店。