Поделиться через


Практическое руководство. Формулировка запросов-объединений и запросов векторного произведения

В следующем примере показано, как объединить результаты из нескольких таблиц.

Пример 1

В следующем примере используется навигация по внешнему ключу в предложении From Visual Basic (from предложение в C#) для выбора всех заказов для клиентов в Лондоне.

var infoQuery =
    from cust in db.Customers
    from ord in cust.Orders
    where cust.City == "London"
    select ord;
Dim infoQuery = _
From cust In db.Customers, ord In cust.Orders _
Where cust.City = "London" _
Select ord

Пример 2

В следующем примере используется навигация по внешнему ключу Where в предложении Visual Basic (whereпредложение в C#) для фильтрации вне запасовProducts, Supplier США.

var infoQuery =
    from prod in db.Products
    where prod.Supplier.Country == "USA" && prod.UnitsInStock == 0
    select prod;
Dim infoQuery = _
    From prod In db.Products _
    Where prod.Supplier.Country = "USA" AndAlso _
        CShort(prod.UnitsInStock) = 0 _
    Select prod

Пример 3

В следующем примере используется навигация по внешнему ключу From в предложении Visual Basic (from предложение в C#) для фильтрации сотрудников в Сиэтле и перечисления их территорий.

var infoQuery =
    from emp in db.Employees
    from empterr in emp.EmployeeTerritories
    where emp.City == "Seattle"
    select new
    {
        emp.FirstName,
        emp.LastName,
        empterr.Territory.TerritoryDescription
    };

Пример 4

В следующем примере используется навигация по внешнему ключу в Select предложении Visual Basic (select предложение в C#) для фильтрации пар сотрудников, в которых один сотрудник сообщает другому и где оба сотрудника совпадают City.

var infoQuery =
    from emp1 in db.Employees
    from emp2 in emp1.Employees
    where emp1.City == emp2.City
    select new
    {
        FirstName1 = emp1.FirstName,
        LastName1 = emp1.LastName,
        FirstName2 = emp2.FirstName,
        LastName2 = emp2.LastName,
        emp1.City
    };

Dim infoQuery = _
    From e1 In db.Employees, e2 In e1.Employees _
    Where e1.City = e2.City _
    Select FirstName1 = e1.FirstName, _
        LastName1 = e1.LastName, FirstName2 = e2.FirstName, _
        LastName2 = e2.LastName, e1.City

Пример 5

Следующий пример Visual Basic ищет всех клиентов и заказов, гарантирует соответствие заказов клиентам и гарантирует, что для каждого клиента в этом списке указано имя контакта.

Dim q1 = From c In db.Customers, o In db.Orders _
         Where c.CustomerID = o.CustomerID _
         Select c.CompanyName, o.ShipRegion

' Note that because the O/R designer generates class
' hierarchies for database relationships for you,
' the following code has the same effect as the above
' and is shorter:

Dim q2 = From c In db.Customers, o In c.Orders _
         Select c.CompanyName, o.ShipRegion

For Each nextItem In q2
    Console.WriteLine("{0}   {1}", nextItem.CompanyName, _
        nextItem.ShipRegion)
Next

Пример 6

В следующем пример явно соединяются две таблицы и проецируются результаты из обеих таблиц.

var q =
    from c in db.Customers
    join o in db.Orders on c.CustomerID equals o.CustomerID
        into orders
    select new { c.ContactName, OrderCount = orders.Count() };
Dim q = From c In db.Customers _
        Group Join o In db.Orders On c.CustomerID Equals o.CustomerID _
            Into orders = Group _
        Select c.ContactName, OrderCount = orders.Count()

Пример 7

В следующем пример явно соединяются три таблицы и проецируются результаты из каждой таблицы.

var q =
    from c in db.Customers
    join o in db.Orders on c.CustomerID equals o.CustomerID
        into ords
    join e in db.Employees on c.City equals e.City into emps
    select new
    {
        c.ContactName,
        ords = ords.Count(),
        emps = emps.Count()
    };
Dim q = From c In db.Customers _
        Group Join o In db.Orders On c.CustomerID Equals o.CustomerID _
            Into ords = Group _
        Group Join e In db.Employees On c.City Equals e.City _
            Into emps = Group _
        Select c.ContactName, ords = ords.Count(), emps = emps.Count()

Пример 8

В следующем примере показано, как реализовать оператор LEFT OUTER JOIN с помощью метода DefaultIfEmpty(). Если для сотрудника (DefaultIfEmpty()) не имеется заказов (Order), метод Employee возвращает значение NULL.

var q =
    from e in db.Employees
    join o in db.Orders on e equals o.Employee into ords
        from o in ords.DefaultIfEmpty()
        select new { e.FirstName, e.LastName, Order = o };
Dim q = From e In db.Employees() _
        Group Join o In db.Orders On e Equals o.Employee Into ords _
            = Group _
        From o In ords.DefaultIfEmpty() _
        Select e.FirstName, e.LastName, Order = o

Пример 9

В следующем примере проецируется выражение let, полученное в результате соединения.

var q =
    from c in db.Customers
    join o in db.Orders on c.CustomerID equals o.CustomerID
        into ords
    let z = c.City + c.Country
        from o in ords
        select new { c.ContactName, o.OrderID, z };
Dim q = From c In db.Customers _
        Group Join o In db.Orders On c.CustomerID Equals o.CustomerID _
            Into ords = Group _
        Let z = c.City + c.Country _
        From o In ords _
        Select c.ContactName, o.OrderID, z

Пример 10

В следующем примере показан оператор join с композитным ключом.

var q =
    from o in db.Orders
    from p in db.Products
    join d in db.OrderDetails
        on new { o.OrderID, p.ProductID } equals new
    {
        d.OrderID,
        d.ProductID
    } into details
        from d in details
        select new { o.OrderID, p.ProductID, d.UnitPrice };
Dim q = From o In db.Orders _
        From p In db.Products _
        Group Join d In db.OrderDetails On New With {o.OrderID, _
            p.ProductID} _
            Equals New With {d.OrderID, d.ProductID} Into details _
                = Group _
        From d In details _
        Select o.OrderID, p.ProductID, d.UnitPrice

Пример 11

В следующем примере показано, как создать оператор join, в котором одна сторона может принимать значение NULL, а другая сторона не может.

var q =
    from o in db.Orders
    join e in db.Employees
        on o.EmployeeID equals (int?)e.EmployeeID into emps
        from e in emps
        select new { o.OrderID, e.FirstName };
Dim q = From o In db.Orders _
        Group Join e In db.Employees On o.EmployeeID _
            Equals e.EmployeeID Into emps = Group _
        From e In emps _
        Select o.OrderID, e.FirstName

См. также