2014-10-12 211 views
0

我有4個XML文件包含這種格式的數據。這些數據實際上來自Microsoft Northwind數據庫,但我已經獲得了XML格式的一些表格。完整的關係圖可用hereLINQ查詢獲取數據

訂單

<Orders> 
    <Order> 
    <OrderID>10248</OrderID> 
    <CustomerID>VINET</CustomerID> 
    <EmployeeID>5</EmployeeID> 
    </Order> 
............. 
............. 
............. 

訂單明細

<OrderDetails> 
    <OrderDetail> 
    <OrderID>10248</OrderID> 
    <Quantity>12</Quantity> 
    <UnitPrice>14.0000</UnitPrice> 
    </OrderDetail> 
    <OrderDetail> 
    <OrderID>10248</OrderID> 
    <Quantity>10</Quantity> 
    <UnitPrice>9.8000</UnitPrice> 
    </OrderDetail> 
............. 
............. 
............. 

員工

<Employee> 
    <EmployeeID>5</EmployeeID> 
    <FirstName>Steve</FirstName> 
    <LastName>Buchanan</LastName> 
    </Employee> 
    <Employee> 
    <EmployeeID>6</EmployeeID> 
    <FirstName>Michael</FirstName> 
    <LastName>Suyama</LastName> 
    </Employee> 
............. 
............. 
............. 

個客戶

<Customer> 
    <CustomerID>VINET</CustomerID> 
    <CompanyName>Vins et alcools Chevalier</CompanyName> 
    <ContactName>Paul Henriot</ContactName> 
    </Customer> 
    <Customer> 
    <CustomerID>WANDK</CustomerID> 
    <CompanyName>Die Wandernde Kuh</CompanyName> 
    <ContactName>Rita Müller</ContactName> 
    </Customer> 
    <Customer> 
............. 
............. 
............. 

現在我想要得到的對象的列表,使得每個對象包含以下內容:

  1. 的OrderId(Orders表 - 例如 - 10248)
  2. 公司名稱爲以上訂單編號(來自Customers表 - 例如 - Vins et alcools Chevalier)
  3. 上述訂單編號的聯繫人姓名(來自Customers表 - 示例 - Paul Henriot)
  4. 員工名稱爲僱員ID爲相應的訂單ID(從僱員表 - 示例 - 史蒂夫布坎南)
  5. Total OrderDetails表上述訂單id的總數量。這將是12 + 10 = 22,因爲有兩個訂單編號爲10248
  6. OrderDetails表中上述訂單編號的總價格。這將是12 * 14 + 10 * 9.8 = 266。

所以對象中的一個將看起來像這樣 - {10248,VIN的等alcools士,保羅亨裏厄特,史蒂夫布坎南,22,266}

現在我可以寫一個LINQ查詢,讓我的OrderID,聯繫人姓名和公司名稱是這樣的:

var list = from o in ordersList 
       join cl in customersList 
       on o.CustomerId equals cl.CustomerId 
       select new 
       { 
        o.OrderId, 
        cl.CompanyName, 
        cl.ContactName 
       }; 

但這只是給了我三兩件事。我努力獲取對象所需的全部6件東西。此外,如何執行計算,因爲訂單表中的一個orderid可以具有多個訂單細節。例如 - 對於訂單ID 10248,我們有2個訂單細節。

感謝

回答

3

你需要多個連接和組通過像下面

var list = from o in ordersList 
      join cl in customersList 
      on o.CustomerID equals cl.CustomerID 
      join ol in orderDetailsList 
      on o.OrderID equals ol.OrderID 
      join e in employeeList 
      on o.EmployeeID equals e.EmployeeID 
      select new 
      { 
       o.OrderID, 
       cl.CompanyName, 
       cl.ContactName, 
       EmployeeName = e.FirstName + " " +e.LastName, 
       ol.Quantity, 
       ol.UnitPrice 
      }; 
var result = list.GroupBy(x => x.OrderID).Select(g => new 
{ 
    OrderID = g.Key, 
    CompanyName = g.First().CompanyName, 
    ContactName = g.First().ContactName, 
    EmployeeName = g.First().EmployeeName, 
    TotalQuantity = g.Sum(x => x.Quantity), 
    TatalPrice = g.Sum(x => x.Quantity * x.UnitPrice) 
}); 
+0

謝謝哥們。我有很多東西需要學習。謝謝你的時間。 – VVV 2014-10-12 07:51:04