1

次のように、データテーブルから少なくとも1つの行をプルするように記述されたLINQクエリがあります。

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のさまざまなメソッドを試しましたが、どこに配置すればよいかわかりません。

どんな助けでもいただければ幸いです。

ありがとう、ロブ

4

2 に答える 2

1

ここには 2 つの別個の問題があります。まず、クエリが何も返さない場合、DefaultIfEmptynull を含むシーケンスを効果的に提供します。DataRowこれは、文字列を割り当てようとしたときではなく、Where句内にあるときに失敗します。次に、一致するエントリがない場合、通常は null を返す which使用しています。FirstOrDefault

私は個人的に呼び出しを削除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
}; 

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

于 2011-08-02T16:23:34.107 に答える
1

generalQuery を削除DefaultIfEmpty()し、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",
   ....
}; 
于 2011-08-02T16:24:08.420 に答える