2011-08-02 20 views
1

私は次のようにLINQクエリはデータテーブルから少なくとも1つの行を引っ張るように書かれている:DataTableへの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") 
      }; 

I次いでLINQ問合せ出力の値を持つクラスの新しいインスタンスのプロパティを設定しようとします。

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

問題は、クエリに結果がないことがあります。これは、GeneralInformationTypeのさまざまな文字列の値をnullに設定して例外を発生させようとします。私はDefaultIfEmptyのさまざまなメソッドを試しましたが、どこに置くべきか分かりません。

ご協力いただければ幸いです。

おかげで、 ロブ

答えて

1

一般的なクエリでDefaultIfEmpty()を削除し、そのように空です:

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

ここでは2つの別々の問題があります。最初に、DefaultIfEmptyは、クエリが何も返されない場合、null 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 
}; 

明らかにしたいものは何でも「デフォルト」に変更します。より具体的な要件がある場合は、あなたがしようとしていることを説明してください。私はそれらを収容することができると確信しています...

関連する問題