我编写了一个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方法,但无法确定放在哪里。
任何帮助都将不胜感激。
谢谢, 罗布
答案 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",
....
};