对于数据表的LINQ,DefaultIfEmpty?

对于数据表的LINQ,DefaultIfEmpty?,linq,linq-to-sql,defaultifempty,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

我编写了一个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")
          };
我遇到的问题是,查询中偶尔没有结果。这会尝试将GeneralInformationType中各种字符串的值设置为null,并导致异常。我尝试了各种DefaultIfEmpty方法,但不知道该放在哪里

任何帮助都将不胜感激

谢谢,
Rob

这里有两个不同的问题。首先,
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
}; 
var-generalQuery=
来自contacts.AsEnumerable()中的联系人
其中contact.Field(“contact_TYPE”).ToUpper()=“AGENT”
选择新的
{
AgentName=contact.Field(“名字”)+“”+
联系人字段(“姓氏”),
AgentPhoneNumber=联系人字段(“电话”),
AgentMailAddress=联系人字段(“电子邮件”)
};
//比如使用DefaultIfEmpty(…).First()
var result=generalQuery.FirstOrDefault()??
新建{AgentName=“Default”,
agentPhoneumber=“默认”,
agentMailAddress=“Default”};
var genInfo=新的通用信息类型
{
AgentName=result.AgentName,
AgentPhoneNumber=result.AgentPhoneNumber,
AgentMailAddress=result.AgentMailAddress
}; 

显然,将“默认值”更改为您想要的任何值。如果您有更具体的要求,请解释您正在尝试做什么,我相信我们能够满足这些要求…

我建议删除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",
   ....
}; 
var-generalQuery=
来自contacts.AsEnumerable()中的联系人
其中contact.Field(“contact_TYPE”).ToUpper()=“AGENT”
选择新的
{
AgentName=contact.Field(“名字”)+“”+
联系人字段(“姓氏”),
AgentPhoneNumber=联系人字段(“电话”),
AgentMailAddress=联系人字段(“电子邮件”)
};
var genInfo=新的通用信息类型
{
AgentName=generalQuery.Any()?generalQuery.First().AgentName:“默认名称”,
....
}; 

两个答案似乎都正确。我选择这个而不是Jon的,因为它是我使用的方法,不需要临时的“结果”对象。谢谢你的帮助!
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",
   ....
};