如何在嵌套LINQ中设置值选择父选择结果?

时间:2015-07-31 09:38:21

标签: c# xml linq linq-to-xml

这是我的LINQ:

            var sdEnumTypes = from et in sdXmlEnums.Elements("Enum")
                          select new SdEnum
                          {
                              Name = et.Attribute("name").Value,
                              EnumGuid = et.Attribute("guid").Value,
                              Enumerators = (from en in et.Elements("Enumerator")
                                             select new SdEnumerator
                                             {
                                                 DisplayName = en.Attribute("displayName").Value,
                                                 Name = en.Attribute("name").Value
                                                 //Enum = I want this to point to parent SdEnum
                                             }).ToList()
                          };

我想将(注释部分)枚举值设置为在升级时选择的SdEnum。怎么做?

这是正在解析的相应XML,以便您可视化我想要做的事情:

    <Enums>
    <Enum name="Color" guid="{2C68F947-3103-4F3C-9855-60F289B3A039}">
        <Enumerator name="Red" displayName="Red Color"/>
        <Enumerator name="Green" displayName="Green Color" />
        <Enumerator name="Blue" displayName="BlueColor"/>
    </Enum>
</Enums>

P.S。 有没有办法简化这个查询?

2 个答案:

答案 0 :(得分:0)

这是一个使用XML Linq

的方法
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string input = 
                "<Enums>" +
                    "<Enum name=\"Color\" guid=\"{2C68F947-3103-4F3C-9855-60F289B3A039}\">" +
                        "<Enumerator name=\"Red\" displayName=\"Red Color\"/>" +
                        "<Enumerator name=\"Green\" displayName=\"Green Color\" />" +
                        "<Enumerator name=\"Blue\" displayName=\"BlueColor\"/>" +
                    "</Enum>" +
                "</Enums>";

            XDocument doc = XDocument.Parse(input);

            var results = doc.Descendants("Enum").Select(x => new {
                name = x.Attribute("name").Value,
                guid = x.Attribute("guid").Value,
                enumerator = x.Elements("Enumerator").Select(y => new {
                    name = y.Attribute("name").Value,
                    displayName = y.Attribute("displayName").Value,
                    parent = x
                }).ToList()
            }).ToList();
        }
    }
}
​

答案 1 :(得分:0)

最简单的方法是使用另一个投影:

var result = sdEnumTypes.Select(e =>
{
    e.Enumerators.ForEach(enumerator => enumerator.Enum = e);
    return e;
});