在select中使用select

时间:2017-02-28 18:32:38

标签: c# linq

假设我有以下XML格式。

<data>
    <appName>Microsoft Word</appName>
    <appId>123</appId>
</data>

如果XML中有多个数据树,我有以下代码来构建数据对象列表。

List<DataObj> dataObjList = 
    (
        from dataNode in xmlDoc.Elements("data")
        select new DataObj
        {
            appName = dataNode.Element("appName"),
            appId = dataNode.Element("appId")
        }
    ).ToList();

但是,如果我在数据标记下添加一个额外的树,我会遇到问题,如下所示:

<data>
    <appName>Microsoft Word</appName>
    <appId>123</appId>
    <appOptions>
          <Win7Compat>true</Win7Compat>
          <Win7x64Compat>false</Win7x64Compat>
    </appOptions>
</data>

我使用以下代码:

List<DataObj> dataObjList = 
    (
        from dataNode in xmlDoc.Elements("data")
        select new DataObj
        {
            appName = dataNode.Element("appName"),
            appId = dataNode.Element("appId")
            appOptions = 
            (
                from appNode in dataNode.Elements("appOptions")
                select new AppOptionsObj
                {
                    win7Compat = appNode.Element("Win7Compat"),
                    win7x64Compat = appNode.Element("Win7x64Compat")
                }
            ) as AppOptionsObj,
        }
    ).ToList();

我的appOptions对象始终被视为null。我有一种感觉,我没有正确解析子树。

1 个答案:

答案 0 :(得分:2)

问题在于您使用as AppOptionsObj进行投射,但您的Select实际上正在返回IEnumerable<AppOptionsObj>,因此投射会产生null。您可能希望使用SingleOrDefault()来返回单个实例:

List<DataObj> dataObjList = 
    (
        from dataNode in xmlDoc.Elements("data")
        select new DataObj
        {
            appName = dataNode.Element("appName"),
            appId = dataNode.Element("appId")
            appOptions = 
            (
                from appNode in dataNode.Elements("appOptions")
                select new AppOptionsObj
                {
                    win7Compat = appNode.Element("Win7Compat"),
                    win7x64Compat = appNode.Element("Win7x64Compat")
                }
            ).SingleOrDefault(),
        }
    ).ToList();