Запрос LINQ для получения данных

У меня есть 4 файла XML, которые содержат данные в этом формате. Эти данные на самом деле из базы данных Microsoft Northwind, но у меня есть несколько таблиц в формате XML. Полная диаграмма отношений доступна здесь.

Заказы

<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. Название компании для указанного выше идентификатора заказа (из таблицы «Клиенты» — пример — Vins et alcools Chevalier)
  3. Имя контактного лица для указанного выше идентификатора заказа (из таблицы «Клиенты» — пример — Пол Энрио)
  4. Имя сотрудника для идентификатора сотрудника для соответствующего идентификатора заказа (из таблицы «Сотрудники» — пример — Стив Бьюкенен)
  5. Общее количество для вышеуказанного идентификатора заказа из таблицы OrderDetails. Это будет 12 + 10 = 22, потому что есть два заказа с идентификатором заказа 10248.
  6. Общая цена для вышеуказанного идентификатора заказа из таблицы OrderDetails. Это будет 12*14 + 10*9,8 = 266.

Таким образом, один из объектов будет выглядеть так — {10248, Vins et alcools Chevalier, Paul Henriot, Steve Buchanan, 22, 266}

Теперь я могу написать запрос LINQ, чтобы получить идентификатор заказа, имя контакта и название компании, например:

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 вещей, которые необходимы для содержания объекта. Также как выполнить расчет, поскольку один идентификатор заказа в таблице заказов может иметь несколько сведений о заказе. Например, для заказа с идентификатором 10248 у нас есть 2 детали заказа.

Спасибо


person Varun Sharma    schedule 12.10.2014    source источник


Ответы (1)


вам нужно несколько объединений и групп, как показано ниже

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)
});
person Damith    schedule 12.10.2014
comment
Спасибо, приятель. Мне нужно многому научиться. Спасибо за ваше время. - person Varun Sharma; 12.10.2014