C# Linq語法(二)
續上篇 ---> 上篇參考
上一篇利用Linq撈出XML語法後
接著是更進一步的應用 join GroupJoin及綜合用法
.
程式碼:
上一篇利用Linq撈出XML語法後
接著是更進一步的應用 join GroupJoin及綜合用法
.
圖1
圖2
圖3
程式碼:
圖1
private void button4_Click(object sender, EventArgs e) { XDocument doc1 = XDocument.Load(@"C:\資料庫檔\中文北風XML\產品.xml"); XDocument doc2 = XDocument.Load(@"C:\資料庫檔\中文北風XML\產品類別.xml"); /* * 說明:在產品.xml中有產品類別這個欄位,但是這個欄位是用產品類別.xml的代碼表示 * 要使這2個表關連後顯示「產品類別」中的代碼類別為何。 * * 實作如下: var result = from xx in doc1.Descendants("產品") join yy in doc2.Descendants("產品類別") on xx.Element("類別編號").Value equals yy.Element("類別編號").Value select new { Id = xx.Element("產品編號").Value, Name = xx.Element("產品名稱").Value, TypeName = yy.Element("類別名稱").Value, Price = xx.Element("單價").Value, Unit = xx.Element("單位數量").Value, Stock = xx.Element("庫存量").Value }; // join on 「產品」中類別編號的值 equal 「產品類別」中類別編號的值 */ //上列注解可用下方的語法,結果相同,但更為簡潔 var result = (from xx in doc1.Descendants("產品") select xx).Join( doc2.Descendants("產品類別"), y => y.Element("類別編號").Value, x => x.Element("類別編號").Value, (x, y) => new { Id = x.Element("產品編號").Value, Name = x.Element("產品名稱").Value, TypeName = y.Element("類別名稱").Value, Price = x.Element("單價").Value, Unit = x.Element("單位數量").Value, Stock = x.Element("庫存量").Value } ); StringBuilder sb = new StringBuilder(); foreach (var a in result) sb.Append(a.Id).Append("\t") .Append(a.Name).Append("\t") .Append(a.TypeName).Append("\t") .Append(a.Price).Append("\t") .Append(a.Unit).Append("\t") .Append(a.Stock).Append("\t") .Append("\r\n"); textBox1.Text = sb.ToString(); dataGridView1.DataSource = result.ToList(); }
圖2
private void button5_Click(object sender, EventArgs e) { XDocument doc1 = XDocument.Load(@"C:\資料庫檔\中文北風XML\訂單主檔.xml"); XDocument doc2 = XDocument.Load(@"C:\資料庫檔\中文北風XML\員工.xml"); XDocument doc3 = XDocument.Load(@"C:\資料庫檔\中文北風XML\客戶.xml"); XDocument doc4 = XDocument.Load(@"C:\資料庫檔\中文北風XML\送貨方式.xml"); //訂單主檔.xml中有許多欄與其他表關連,可以利用Linq語法join出的結果,再繼續join var result = from xx in doc1.Descendants("訂單主檔") join yy in doc4.Descendants("送貨方式") on xx.Element("送貨方式").Value equals yy.Element("送貨編號").Value select new { Id = xx.Element("訂單號碼").Value, Cid = xx.Element("客戶編號").Value, Eid = xx.Element("員工編號").Value, Date = xx.Element("訂單日期").Value, ShipType = yy.Element("方式").Value }; var result2 = (from zz in result.ToList() join aa in doc2.Descendants("員工") on zz.Eid equals aa.Element("員工編號").Value select new { Id = zz.Id, Cid = zz.Cid, EmployeeName = aa.Element("姓名").Value, Date = zz.Date, ShipType = zz.ShipType }).Join( //產生出的結果,再join 客戶.xml doc3.Descendants("客戶"), x => x.Cid, y => y.Element("客戶編號").Value, (x, y) => new { OrderId = x.Id, CompanyName = y.Element("公司名稱").Value, Customer = y.Element("連絡人").Value, EmployeeName = x.EmployeeName, Date = DateTime.Parse(x.Date), ShipType = x.ShipType } ); StringBuilder sb = new StringBuilder(); foreach (var a in result2) sb.Append(a.OrderId).Append("\t") .Append(a.CompanyName).Append("\t") .Append(a.Customer).Append("\t") .Append(a.EmployeeName).Append("\t") .Append(a.Date).Append("\t") .Append(a.ShipType).Append("\t") .Append("\r\n"); textBox1.Text = sb.ToString(); dataGridView1.DataSource = result2.ToList(); }
圖3
private void button6_Click(object sender, EventArgs e) { SqlConnection cnn1 = new SqlConnection("server=localhost;database=中文北風;UID=SQLUser;PWD=1234"); SqlCommand cmd1 = new SqlCommand("SELECT 產品編號,產品,類別編號,單價 FROM 產品資料", cnn1); OleDbConnection cnn2 = new OleDbConnection(); cnn2.ConnectionString = @"Provider=Microsoft.JET.OLEDB.4.0;Data Source=C:\資料庫檔\北風A.mdb"; OleDbCommand cmd2 = new OleDbCommand("SELECT 類別編號,類別名稱 FROM 產品類別", cnn2); DataTable t1 = new DataTable(); DataTable t2 = new DataTable(); cnn1.Open(); SqlDataReader mydr1 = cmd1.ExecuteReader(); t1.Load(mydr1); mydr1.Close(); cmd1.Dispose(); cnn1.Close(); cnn2.Open(); OleDbDataReader mydr2 = cmd2.ExecuteReader(); t2.Load(mydr2); mydr2.Close(); cmd2.Dispose(); cnn2.Close(); /* * 說明:由SQLServer中抓出「產品資料」,再由Access中抓出「產品類別」 * 將2張表join後group by 產品類別,算出各 產品類別 的平均為何 * var tempResult = from xx in t1.AsEnumerable() join yy in t2.AsEnumerable() on xx.Field("類別編號") equals yy.Field ("類別編號") select new { 類別名稱 = yy.Field ("類別名稱"), 價錢=xx.Field ("單價") }; var result = from zz in tempResult.ToList() group zz by zz.類別名稱 into gg select new { 類別名 = gg.Key, 平均售價 = gg.Average(a => a.價錢), 數量 = gg.Count() }; */ var result = (from xx in t2.AsEnumerable() select new { 類別編號 = xx.Field ("類別編號"), 類別名 = xx.Field ("類別名稱") }).GroupJoin( t1.AsEnumerable(), x => x.類別編號, y => y.Field ("類別編號"), (a, b) => new { 類別名 = a.類別名, 平均售價 = b.Average(c=>c.Field ("單價")), 數量 = b.Count() } ); dataGridView1.DataSource = result.ToList(); }
留言
張貼留言