有没有更好的方法来编写以下Linq查询

时间:2016-01-27 21:02:43

标签: c# .net xml linq

假设我们有一个XML文档列表,列表“data”。在此列表中可能会出现CoOwner。像下面的结构(只是一个例子)

<root>
    <owner> 
        <firstname>Joe</firstname>
        <fastname>Cole</lastname>
        <!--- etc. -->
    </owner>
    <coOwner>
        <firstname>Smith</firstname>
        <lastname>Cole</lastname>
        <!--- etc. --->
    </coOwner>
    <coOwner>
        <firstname>Janna</firstname>
        <lastname></lastname>
        <!--- etc. --->
    </coOwner>
</root>

如果文档中有coOwner,则应将它们放入结果列表中。但只有Firstname和Lastname 确实发生并拥有数据(不像XML文档中的第二个coOwner那样空)。

我已经进行了以下Linq查询,这可以解决问题。

var result = data.Descendants("coOwner").Where(co =>
            (!string.IsNullOrEmpty(co.Element("firstname").Value)) &&
            (!string.IsNullOrEmpty(co.Element("fastname").Value))).Select(co => new CoOwner()
            {
                Firstname = co.Element("firstname").Value,
                Lastname = co.Element("fastname").Value,
            });

但我想知道,如果有更简洁的方法可以做到这一点。它很好, 但我不喜欢o.Element(“Firstname”)的方式。值发生了好几次。这样也存在Null异常的风险 o.Element( “姓名”)。价值。要处理这些元素,必须进行更多的元素提取,如下所示:

var fname = data.Descendants("coOwner").select(co => co.Element("lirstname"))
var lname = data.Descendants("coOwner").select(co => co.Element("lastname"))

    if(fname != null && lname != null){
        //then the same code as mentioned above. 
    }

有更简洁的方式吗?提前致谢

1 个答案:

答案 0 :(得分:4)

将值保存到单独的范围变量和过滤器中,不需要重复。并且在尝试检索元素或属性的值时应始终使用强制转换。

var query =
    from co in data.Descendants("coOwner")
    let fname = (string)co.Element("firstname")
    let lname = (string)co.Element("lastname")
    where !String.IsNullOrWhiteSpace(fname)
    where !String.IsNullOrWhiteSpace(lname)
    select new CoOwner
    {
        Firstname = fname,
        Lastname = lname,
    };