Linq - 如何选择一个新对象来包含其他对象的列表?

5

我需要帮助创建一个linq查询,以选择一个Product对象列表。每个Product对象包含一个ProductItem列表。我不确定如何创建Product.ProductItems列表。有人可以帮帮我吗?这是Product、ProductItem和我正在使用的xml结构的示例。

这是我处理这个问题的方向示例:

XDocument xDocument = XDocument.Load("../Content/index.xml");
            return xDocument.Descendants("item")
                .Select(arg =>
                        new Product
                        {
                            Name = arg.Parent.Attribute("name").Value,
                            ProductItems = new ProductItem{//set properties for PI} // This is where Im stuck.


                        })
                .ToList();
        }

我想提高我的linq/lambda技能,如果您能给我一个使用lambda语法的示例,我将不胜感激!
非常感谢。
public class Product
{
    public string Name { get; set; }
    public IList<ProductItem> ProductItems { get; set; }

}

public class ProductItem
{
    public string Hwid { get; set; }
    public string Href { get; set; }
    public string Localization { get; set; }
    public DateTime BuildDateTime { get; set; }
    public string IcpBuildVersion { get; set; }
}

}

<products>
<product name="Product1">
  <item hwid="abk9184">
    <href>Product1/abk9184_en-us/abk9184.html</href>
    <localization>en-us</localization>
    <build.start>2011-06-08 22:02 PM</build.start>
    <build.icp>9.0.192.32</build.icp>
  </item>
  <item hwid="abk9185">
    <href>LearningModules/abk9185_en-us/abk9185.html</href>
    <localization>en-us</localization>
    <build.start>2011-06-08 22:03 PM</build.start>
    <build.icp>9.0.192.32</build.icp>
  </item>
</product>
<product name="Product2">
  <item hwid="aa6410">
    <href>Product2/aa6410_en-us/aa6410.html</href>
    <localization>en-us</localization>
    <build.start>2011-06-08 22:04 PM</build.start>
    <build.icp>9.0.192.32</build.icp>
  </item>
  <item hwid="tu6488">
    <href>Product2/tu6488_en-us/tu6488.html</href>
    <localization>en-us</localization>
    <build.start>2011-06-08 22:04 PM</build.start>
    <build.icp>9.0.192.32</build.icp>
  </item>
1个回答

21

您应该遍历Product元素,而不是其子元素。这样更容易按产品收集项目。

var doc = XDocument.Load("../Content/index.xml");
var products = doc.Elements("product")
    .Select(p => new Product
    {
        Name = (string)p.Attribute("name"),
        ProductItems = p.Elements("item")
            .Select(i => new ProductItem
            {
                //set properties for PI
                Hwid = (string)i.Attribute("hwid"),
                Href = (string)i.Element("href"),
                Localization = (string)i.Element("localization"),
                // etc.
            })
            .ToList(),
    })
    .ToList();

2
有道理。我明白你是如何进行第二个选择的。看起来不错。谢谢! - Nick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接