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

这里有两个不同的问题。首先,如果查询没有返回任何内容,DefaultIfEmpty它将有效地为您提供一个带有 null 的序列。DataRow然后,它不会在尝试分配字符串时失败,而是在Where子句中时失败。然后,如果没有匹配的条目,您还将使用which 通常会返回 null 。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

我建议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",
   ....
}; 
于 2011-08-02T16:24:08.420 回答