LINQ到DataTable的DefaultIfEmpty?

时间:2011-08-02 16:16:47

标签: linq linq-to-sql defaultifempty

我编写了一个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方法,但无法确定放在哪里。

任何帮助都将不胜感激。

谢谢, 罗布

2 个答案:

答案 0 :(得分: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
}; 

显然将“默认”更改为您想要的任何内容。如果您有更具体的要求,请说明您要做的事情,我相信我们能够容纳它们......

答案 1 :(得分: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",
   ....
}; 
相关问题