我得到了一个null异常,因为MYTAG1不存在。我理解这是因为Element(“MYTAG1”)为null并且调用Elements(“MYTAG2”)就不行了。
如何处理此问题以防止崩溃?
var myItems = from myNode in Nodes.Element("MYTAG1").Elements("MYTAG2")
select new EPTableItem
{
// Assign stuff here
};
答案 0 :(得分:2)
我想不出一种将if
语句合并到C#查询语法中的聪明方法,因此我将提出以下解决方案,在执行查询之前检查所需的节点。
var myItems;
XElement myTag1 = myNode.Element("MYTAG1");
if (myTag1 != null)
{
myItems = from myNode in myTag1.Elements("MYTAG2")
select new EPTableItem
{
// Assign stuff here
};
}
答案 1 :(得分:1)
一种选择是定义新的扩展方法并将其用作查询源。
static IEnumerable<XElement> ElementAndChildren(this XElement parent, string name, string childName)
{
var element = parent.Element(name);
if (element == null)
{
return Enumerable.Empty<XElement>();
}
return element.Elements(childName);
}
...
var myItems = from myNode in Nodes.ElementAndChildren("MYTAG1","MYTAG2")
select new EPTableItem
{
// Assign stuff here
};
答案 2 :(得分:1)
当您使用扩展方法而不是伪sql语法时,我发现Linq更容易。你应该能够沿着这些方向做一些事情,但要记住我还没有测试过代码。
var myItems = Nodes.Where(n => n.Element("MYTAG1") != null)
.Select(n => n.Element("MYTAG1"))
.Select(elem => elem.Elements("MYTAG2"))
.Select(elem2 => new EPTTableItem { something = elem2.SomeProperty ... } );
答案 3 :(得分:0)
如果你想在LINQ中做这样的事情应该有效:
var myItems = from node in (from myNode in Nodes.Elements("MYTAG1")
where myNode != null
select myNode).SelectMany(x => x.Elements("MYTAG2"))
select new EPTableItem
{
// Assign stuff here
};
当然,如果出现更多MYTAG
,这将有所不同答案 4 :(得分:0)
您可以在单个LINQ查询中使用单独的from子句和where子句完成所有操作。
var myItems =
from tag1 in Nodes.Elements("MYTAG1")
where tag1 != null
from tag2 in tag1.Elements("MYTAG2")
select new EPTableItem
{
// Assign stuff here
};