2011-08-02 26 views
1

我有一個LINQ查詢寫入到從數據表中拉至少一行如下:DefaultIfEmpty?

var generalQuery = 
     from contact in contacts.AsEnumerable().DefaultIfEmpty() 
     where contact.Field<String>("CONTACT_TYPE").ToUpper() == "AGENT" 
     select new 
      { 
      AgentName = contact.Field<String>("FIRST_NAME") + " " + 
       contact.Field<String>("LAST_NAME"), 
      AgentPhoneNumber = contact.Field<String>("PHONE"), 
      AgentEmailAddress = contact.Field<String>("EMAIL") 
      }; 

然後我嘗試設置與LINQ查詢輸出值的類的新實例的屬性:

var genInfo = new GeneralInformationType 
{ 
    AgentName = generalQuery.FirstOrDefault().AgentName, 
    AgentPhoneNumber = generalQuery.FirstOrDefault().AgentPhoneNumber, 
    AgentEmailAddress = generalQuery.FirstOrDefault().AgentEmailAddress 
}; 

我遇到的問題是偶爾在查詢中沒有結果。這會嘗試將GeneralInformationType中各種字符串的值設置爲null並導致異常。我嘗試了DefaultIfEmpty的各種方法,但無法弄清楚它放在哪裏。

任何幫助,將不勝感激。

感謝, 羅布

回答

1

我建議刪除DefaultIfEmpty()在你的generalQuery中,並添加一些邏輯generalQuery是這樣的:

var generalQuery = 
     from contact in contacts.AsEnumerable() 
     where contact.Field<String>("CONTACT_TYPE").ToUpper() == "AGENT" 
     select new 
      { 
      AgentName = contact.Field<String>("FIRST_NAME") + " " + 
       contact.Field<String>("LAST_NAME"), 
      AgentPhoneNumber = contact.Field<String>("PHONE"), 
      AgentEmailAddress = contact.Field<String>("EMAIL") 
      }; 

var genInfo = new GeneralInformationType 
{ 
    AgentName = generalQuery.Any() ? generalQuery.First().AgentName : "Default Name", 
    .... 
}; 
+0

這兩個答案似乎都是正確的。我選擇了Jon的這個,因爲它是我使用的方法,並且不需要臨時的「結果」對象。感謝你的幫助! – SpaceCowboy74

1

這裏有兩個不同的問題。首先,如果查詢不返回任何內容,DefaultIfEmpty將有效地爲您提供一個空值DataRow的序列。然後,當它嘗試分配字符串時會失敗 - 但是在Where子句中。那麼你的使用FirstOrDefault如果沒有匹配的條目通常會返回null。

我會親自刪除DefaultIfEmpty電話,並把所有的違約代碼爲genInfo

var generalQuery = 
     from contact in contacts.AsEnumerable() 
     where contact.Field<String>("CONTACT_TYPE").ToUpper() == "AGENT" 
     select new 
     { 
      AgentName = contact.Field<String>("FIRST_NAME") + " " + 
       contact.Field<String>("LAST_NAME"), 
      AgentPhoneNumber = contact.Field<String>("PHONE"), 
      AgentEmailAddress = contact.Field<String>("EMAIL") 
     }; 

// Like using DefaultIfEmpty(...).First() 
var result = generalQuery.FirstOrDefault() ?? 
     new { AgentName = "Default", 
       AgentPhoneNumber = "Default", 
       AgentEmailAddress = "Default" }; 

var genInfo = new GeneralInformationType 
{ 
    AgentName = result.AgentName, 
    AgentPhoneNumber = result.AgentPhoneNumber, 
    AgentEmailAddress = result.AgentEmailAddress 
}; 

明顯變化,以任何你想要的「默認」。如果你有更具體的要求,請解釋你正在嘗試做什麼,我相信我們可以容納他們...

相關問題