Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用linq的xml多对多连接_C#_Xml_Linq_Join_Many To Many - Fatal编程技术网

C# 使用linq的xml多对多连接

C# 使用linq的xml多对多连接,c#,xml,linq,join,many-to-many,C#,Xml,Linq,Join,Many To Many,我可能在编写正确的代码或提问时出错,但我正在寻求以下方面的帮助 我有一个具有多对多关系的xml文件,如下所示: <ShowRoom> <Cars> <Car id="1" number="001" name="MyCar" > <Parts> <Part id="1" /> <Part id="2" /> </Parts> </Ca

我可能在编写正确的代码或提问时出错,但我正在寻求以下方面的帮助

我有一个具有多对多关系的xml文件,如下所示:

<ShowRoom>
  <Cars>
    <Car id="1" number="001" name="MyCar" >
      <Parts>
        <Part id="1" />
        <Part id="2" />
      </Parts>
    </Car>
    <Car id="2" number="002" name="YourCar" >
      <Parts>
        <Part id="2" />
        <Part id="3" />
        <Part id="4" />
      </Parts>
    </Car>
  </Cars>
  <Parts>
    <Part id="1" name="Tyre" active="true"/>
    <Part id="2" name="Window" active="true"/>
  </Parts>
</ShowRoom>
因此,如何使用上面相同的代码来完成它,或者如果有其他好的方法,请与我分享


谢谢。

我强烈建议建立一个零件字典,然后建立汽车清单:

Dictionary<int, Part> partsById = doc.Root
    .Element("Parts")
    .Elements("Part")
    .Select(p => new Parts
            {
                Id = (int) p.Attribute("id"),
                Name = (string) p.Attribute("name"),
                Active = (bool) p.Attribute("active")
            })
    .ToDictionary(part => part.Id);
您还应该研究自动实现的属性,这将把
Car
类减少到只有几行代码:

public class Car
{
    public int Id { get; set; }
    public string Number { get; set; }
    public string Name { get; set; }
    public List<Parts> ListParts { get; set; }
}
公车
{
公共int Id{get;set;}
公共字符串编号{get;set;}
公共字符串名称{get;set;}
公共列表ListParts{get;set;}
}

这里有一点,为什么要在创建允许调用方获取和设置属性的公共方法时设置私有属性?无论如何,如果您的目的是允许调用方执行获取和设置,那么您应该将它们保留为公共属性。@JonSkeet抱歉我把事情弄糊涂了。谢谢Jon Skeet,这太棒了。我不能投赞成票,因为这需要一些声誉。谢谢德里克的反馈。@JonSkeet很抱歉,如果我造成了混乱,我建议你的课堂应该像John在这里的布景一样,仅此而已。@Derek:值得理解的是,这与海报的原始代码完全相同。它仍然有私有字段和公共属性。在这方面没有任何改变——它只是一个更简单的源代码表示。
                        ListParts =  
                        { 
                                new Parts
                                    {
                                        Id = int.Parse(p.Attribute("id").Value),
                                        Name = (string)p.Attribute("name").Value,
                                        Active = bool.Parse(p.Attribute("active").Value)
                                    }
Dictionary<int, Part> partsById = doc.Root
    .Element("Parts")
    .Elements("Part")
    .Select(p => new Parts
            {
                Id = (int) p.Attribute("id"),
                Name = (string) p.Attribute("name"),
                Active = (bool) p.Attribute("active")
            })
    .ToDictionary(part => part.Id);
...
ListParts = c.Element("Parts")
             .Elements("Part")
             .Select(p => partsById[(int) p.Attribute("Id")])
             .ToList();
public class Car
{
    public int Id { get; set; }
    public string Number { get; set; }
    public string Name { get; set; }
    public List<Parts> ListParts { get; set; }
}