5 Stimmen

Wie erstelle ich eine Where-Bedingung für eine Untertabelle in LINQ?

Dies ist eine Antwort auf folgende Frage Frage im Antwortteil einer anderen Frage.

Ich habe eine Sammlung von Bestellungen, jede Bestellung eine Sammlung von OrderItems, und jedes OrderItem hat eine PartId. Wie kann ich mit LINQ die folgenden SQL-Anweisungen implementieren?

1) Wählen Sie alle Aufträge aus, die eine bestimmte Teile-ID haben.

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

2) Wählen Sie Order.OrderNumber und OrderItem.PartName

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

3) SELECT die Order.OrderNumber und das gesamte OrderItem Detail:

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

12voto

Robert Wagner Punkte 16985

Der tatsächliche Code sollte lauten

1)

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

Die Methode Any() gibt ein bool zurück und entspricht der SQL-Klausel "in". Dies würde alle Bestellungen abrufen, bei denen es Any OrderItems gibt, die eine PartId von 100 haben.

2a)

// 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
                      }

Die beiden from-Klauseln sind wie eine innere Verknüpfung.

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
                       }

Da "i" ein Objekt vom Typ OrderItem ist, wird Item als OrderItem erstellt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X