Как создать условие where в под таблице в LINQ

Это ответ на этот question в разделе ответов другого вопроса.

У меня есть коллекция Orders, каждый упорядочивает коллекцию OrderItems, и каждый OrderItem имеет PartId. Используя LINQ, как реализовать следующие инструкции SQL:

1) Выберите все заказы с идентификатором определенной части

SELECT *
FROM Order
WHERE Id in (SELECT OrderId FROM OrderItems WHERE PartId = 100)

2) Выберите Order.OrderNumber и OrderItem.PartName

SELECT Order.OrderNumber, OrderItem.PartName
FROM Order INNER JOIN OrderItem ON Order.Id = OrderItem.OrderId
WHERE OrderItem.partId = 100

3) ВЫБЕРИТЕ номер Order.OrderNumber и всю деталь OrderItem:

SELECT Order.OrderNumber, OrderItem.*
FROM Order INNER JOIN OrderItem ON Order.Id = OrderItem.OrderId
WHERE OrderItem.partId = 100

Ответ 1

Фактический код должен быть

1)

var orders = from o in Orders
             where o.OrderItems.Any(i => i.PartId == 100)
             select o;

Метод Any() возвращает bool и похож на предложение SQL "in". Это получит весь порядок, где есть Any OrderItems, у которого есть PartId из 100.

2а)

// This will create a new type with the 2 details required 
var orderItemDetail = from o in Orders
                      from i in Orders.OrderItems
                      where i.PartId == 100
                      select new()
                      {
                          o.OrderNumber,
                          i.PartName
                      }

Два из предложений являются внутренним соединением.

2b)

// This  will populate the OrderItemSummary type
var orderItemDetail = from o in Orders
                      from i in Orders.OrderItems
                      where i.PartId == 100
                      select new OrderItemSummary()
                      {
                          OriginalOrderNumber = o.OrderNumber,
                          PartName = i.PartName
                      }

3)

// This will create a new type with two properties, one being the
// whole OrderItem object.
var orderItemDetail = from o in Orders
                      from i in Orders.OrderItems
                      where i.PartId == 100
                      select new()
                      {
                          OrderNumber = o.OrderNumber,
                          Item = i
                       }

Так как "i" является объектом Type OrderItem, элемент создается как OrderItem.