如何将嵌套 LINQ select 中的值设置为父 select 结果?

How to set value in nested LINQ select to parent select result?

这是我的 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。 有什么办法可以简化这个查询吗?

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

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

这是一个使用 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();
        }
    }
}
​