#眉標=LINQ #副標=剖析LINQ運作機制(3) #大標=簡單、快速、易讀的XLINQ #作者=文圖/黃忠成 ============= 程式1 ================ ============= 程式2 static void CreateXmlWithXmlDocument() { XmlDocument doc = new XmlDocument(); XmlNode rootNode = doc.CreateElement("Customers"); XmlNode itemNode1 = doc.CreateElement("Customer"); itemNode1.Attributes.Append(doc.CreateAttribute("ID")).Value = "A0001"; itemNode1.Attributes.Append(doc.CreateAttribute("Name")).Value = "Tom"; itemNode1.Attributes.Append(doc.CreateAttribute("Address")).Value = "Taipen"; rootNode.AppendChild(itemNode1); XmlNode itemNode2 = doc.CreateElement("Customer"); itemNode2.Attributes.Append(doc.CreateAttribute("ID")).Value = "A0002"; itemNode2.Attributes.Append(doc.CreateAttribute("Name")).Value = "Mary"; itemNode2.Attributes.Append(doc.CreateAttribute("Address")).Value = "LD"; rootNode.AppendChild(itemNode2); XmlNode itemNode3 = doc.CreateElement("Customer"); itemNode3.Attributes.Append(doc.CreateAttribute("ID")).Value = "A0003"; itemNode3.Attributes.Append(doc.CreateAttribute("Name")).Value = "Jeff"; itemNode3.Attributes.Append(doc.CreateAttribute("Address")).Value = "YW"; rootNode.AppendChild(itemNode3); doc.AppendChild(rootNode); doc.Save("customers.xml"); }================ ============= 程式3 static void CreateXml() { XDocument doc = new XDocument(new XElement("Customers", new XElement("Customer", new XAttribute("ID", "A0001"), new XAttribute("Name", "Tom"), new XAttribute("Address", "Taipen")), new XElement("Customer", new XAttribute("ID", "A0002"), new XAttribute("Name", "Mary"), new XAttribute("Address", "LD")), new XElement("Customer", new XAttribute("ID", "A0003"), new XAttribute("Name", "Jeff"), new XAttribute("Address", "YW")))); doc.Save("customers.xml"); }================ ============= 程式4 static void ReadXml() { XDocument doc = XDocument.Load("customers.xml"); foreach (XElement elem in doc.Elements("Customers").Descendants("Customer")) Console.WriteLine(string.Format("Customer ID : {0}, Name : {1}, Address : {2}", elem.Attribute("ID").Value, elem.Attribute("Name").Value, elem.Attribute("Address").Value)); Console.ReadLine(); }================ ============= 程式5 foreach (XElement elem in doc.Elements("Customer")) //回傳空的List foreach (XElement elem in doc.Descendants("Customer")) //回傳所有名為Customer的Node================ ============= 程式6 ================ ==<反灰>=========== (string)elem.Attribute("ID")================ ==<反灰>=========== (double)w.Attribute("Total")================ ============= 程式7 static void QueryXml() { XDocument doc = XDocument.Load("customers.xml"); var p = from s in doc.Elements("Customers").Descendants("Customer") where s.Attribute("Address").Value == "YW" select s; foreach (XElement elem in p) Console.WriteLine(string.Format("Customer ID : {0}, Name : {1}, Address : {2}", elem.Attribute("ID").Value, elem.Attribute("Name").Value, elem.Attribute("Address").Value)); Console.ReadLine(); }================ ==<反灰>=========== Customer ID : A0003, Name : Jeff, Address : YW ================ ============= 程式8 static void SortXml() { XDocument doc = XDocument.Load("customers.xml"); var p = from s in doc.Elements("Customers").Descendants("Customer") orderby (string)s.Attribute("ID") descending select s;   foreach (XElement elem in p) Console.WriteLine(string.Format("Customer ID : {0}, Name : {1}, Address : {2}", elem.Attribute("ID").Value, elem.Attribute("Name").Value, elem.Attribute("Address").Value)); Console.ReadLine(); }================ ==<反灰>=========== Customer ID : A0003, Name : Jeff, Address : YW Customer ID : A0002, Name : Mary, Address : LD Customer ID : A0001, Name : Tom, Address : Taipen ================ ============= 程式9 static void Computer() { XDocument doc = XDocument.Load("orders.xml"); var p = from s in doc.Elements("Orders").Elements("Order") group s by s.Attribute("CustomerID").Value into g select new XElement("Customer", new XAttribute("ID", g.Key), new XAttribute("Total", g.Sum(w => (double)w.Attribute("Total")) )); foreach (var p1 in p) { Console.WriteLine(string.Format("Customer ID : {0} Total {1}", p1.Attribute("ID").Value, p1.Attribute("Total").Value)); } Console.ReadLine(); }================ ==<反灰>=========== Customer ID : A0001 Total 26000 Customer ID : A0003 Total 45000================ ============= 程式10 static void JoinOrders() { XDocument customers = XDocument.Load("customers.xml"); XDocument orders = XDocument.Load("orders.xml"); var p = from o in orders.Elements("Orders").Descendants("Order") join c in customers.Elements("Customers").Descendants("Customer") on (string)o.Attribute("CustomerID") equals (string)c.Attribute("ID") select new XElement("Order", new XAttribute("OrderID",(string)o.Attribute("OrderID")), new XAttribute("CustomerID", (string)o.Attribute("CustomerID")),       new XAttribute("Name", (string)c.Attribute("Name")), new XAttribute("Total", (double)o.Attribute("Total")) ); foreach (var p1 in p) { Console.WriteLine(string.Format("Order ID : {0} Customer Name: {1} Total {2}", p1.Attribute("OrderID").Value, p1.Attribute("Name").Value, p1.Attribute("Total").Value)); } Console.ReadLine(); }================ ==<反灰>=========== Order ID : 980001 Customer Name: Tom Total 12000 Order ID : 980002 Customer Name: Tom Total 14000 Order ID : 980003 Customer Name: Jeff Total 45000 ================ ============= 程式11 static void GetOrders() { XDocument customers = XDocument.Load("customers.xml"); XDocument orders = XDocument.Load("orders.xml"); var p = from c in customers.Elements("Customers").Descendants("Customer") join o in orders.Elements("Orders").Descendants("Order") on (string)c.Attribute("ID") equals (string)o.Attribute("CustomerID") into ps select new XElement("Customer", new XAttribute("ID",(string)c.Attribute("ID")), ps); foreach (var p1 in p) { Console.WriteLine(string.Format("Customer : {0}", (string)p1.Attribute("ID"))); Console.WriteLine("-------Orders---------"); foreach (var p2 in p1.Descendants()) Console.WriteLine( string.Format("Order ID : {0} Total : {1}", (string)p2.Attribute("OrderID"), (double)p2.Attribute("Total"))); Console.WriteLine("----------------------"); } Console.ReadLine(); }================ ==<反灰>=========== Customer : A0001 -------Orders--------- Order ID : 980001 Total : 12000 Order ID : 980002 Total : 14000 ---------------------- Customer : A0002 -------Orders--------- ---------------------- Customer : A0003 -------Orders--------- Order ID : 980003 Total : 45000 ----------------------================ ============= 程式12 static void CrossJoin() { XDocument orders = XDocument.Load("orders.xml"); List customers = new List(); customers.Add(new Customer("A0001", "Tom", "Taipen")); customers.Add(new Customer("A0003", "Jeff", "YW")); var p = from o in orders.Elements("Orders").Descendants("Order") join c in customers on (string)o.Attribute("CustomerID") equals c.ID select new XElement("Order", new XAttribute("OrderID", (string)o.Attribute("OrderID")), new XAttribute("CustomerID", (string)o.Attribute("CustomerID")), new XAttribute("Name", c.Name), new XAttribute("Total", (double)o.Attribute("Total")) ); foreach (var p1 in p) { Console.WriteLine(string.Format("Order ID : {0} Customer Name: {1} Total {2}", p1.Attribute("OrderID").Value, p1.Attribute("Name").Value, p1.Attribute("Total").Value)); } Console.ReadLine(); } ............. public class Customer { public string ID { get; set; } public string Name { get; set; } public string Address { get; set; } public Customer(string id, string name, string address) { ID = id; Name = name; Address = address; } }================