简体   繁体   中英

using select within select

Suppose I have the following XML format.

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

Where there are multiple data trees within the XML, I have the following code to build a list of data objects.

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

However, I'm running into problems if I add an additional tree under the data tag, like so:

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

And I use the following code:

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();

My appOptions object is always being treated as null. I have a feeling I'm not parsing the sub tree properly.

The problem is that you as casting with as AppOptionsObj but your Select is actually returning an IEnumerable<AppOptionsObj> so the cast results in a null . You probably want to use SingleOrDefault() to return the single instance instead:

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();

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM