2013-07-18 26 views
1

我有一個LINQ查詢與我從一個對象獲取數據,像這樣:物業獲取的​​值,否則讓其他財產使用LINQ

var attachedItems = items.ToDictionary(
           w => w.Number, 
           w => w.Attachments.Select(a => a.Name).ToArray() 
        ); 

這工作得很好,到目前爲止,但有時Attachments.Name財產是空的。然後我想獲得另一個物業的價值。

舉例說明:

var attachedItems = items.ToDictionary(
           w => w.Number, 
           w => w.Attachments.Select(a => a.Name).ToArray() 
           // If Attachments.Name == Empty, then get 
           w => w.EquipmentCode 
        ); 

我怎樣才能做到這一點的LINQ查詢?

+1

目前尚不清楚是否意味着「沒有附件「或」附件名稱爲空「。 –

+0

你有沒有改變這個問題,我相當肯定你以後有'.Name == Empty',不是嗎? –

回答

6
var attachedItems = items.ToDictionary(
     w => w.Number, 
     w => w.Attachments.Select(a => a.Name) 
         .DefaultIfEmpty(w.EquipmentCode) 
         .ToArray() 
       ); 

此檢索所有附件名稱,如果沒有附件是存在,則返回用含有EquipmentCode值的單個項目的陣列。

如果EquipmentCode屬性在Attachment上定義,並且您需要它作爲每個附件的回退值,請檢查Jon Skeet的回答。

+0

+1我忘了'DefaultIfEmpty',對我很恥 –

+0

不錯,效果很棒! :)我會接受什麼時候讓我。 – Vivendi

1

你可以讓你的SELECT語句使用lambda和手動檢查屬性,像這樣:

var attachedItems = items.ToDictionary(
           w => w.Number, 
           w => w.Attachments.Select(a => { 
           if(String.IsNullOrEmpty(a.Name) == false) 
            return a.Name; 

            return a.EquipmentCode; 
           }).ToArray() 
        ); 
6

聽起來像是你只想條件運算符:

var attachedItems = items.ToDictionary(
     w => w.Number, 
     w => w.Attachments.Select(a => string.IsNullOrEmpty(a.Name) 
            ? a.EquipmentCode : a.Name) 
         .ToArray());