2011-08-02 55 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 
}; 

明显变化,以任何你想要的“默认”。如果你有更具体的要求,请解释你正在尝试做什么,我相信我们可以容纳他们...

相关问题