Linq - Как выбрать новый объект, чтобы содержать список других объектов? - PullRequest
3 голосов
/ 11 июня 2011

Мне нужна помощь в создании запроса linq, который выберет список объектов 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, чтобы вы могли привести пример с использованием синтаксиса лямбда, и я был бы признателен за это!

Спасибо за тонну.

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 Ответ

15 голосов
/ 11 июня 2011

Вы должны проходить через Product потомков, а не предметы.Таким образом, вы читаете элементы 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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...