2009-07-22 18 views
0

Ich bin ziemlich neu in LINQ und kämpfen, um eine Abfrage zu erstellen. Ich habe eine 'Kunden' Tabelle und 'Bestellungen' Tabelle, Eins-zu-viele Beziehung. Wie wähle ich diejenigen Kunden aus, die die älteste Bestellung mit dem Wort "special" in der Bestellbeschreibung haben?Linq Abfrage Frage (eins zu viele, Kind Objekteigenschaften Filter)

Wenn die älteste Bestellung dieses Wort nicht enthält, sollte der Kunde nicht im Ergebnis enthalten sein. Wenn der Kunde keine Bestellungen hat, sollte er nicht im Ergebnis sein. Mit anderen Worten, nur diejenigen Kunden, die Aufträge haben und deren älteste Bestellung das Wort "speziell" enthält, sollten dort sein.

Ich hoffe, ich bin klar und danke.

Antwort

3

public static List < Kunde > SampleSelect (List < Kunde > Clients)
{
        Rückkehr clients.Where (c = > c.Orders.Count &
                                                                          c.Orders.OrderBy (o = > o.Date)
                                                                                          .FirstOrDefault(). Description.Conta ins ("Spezial")). ToList();
}

// Feste Bestellung, thnx zu Ryan Versaw

+0

Dies sollte Ascending statt Descending sein. –

+0

Ja, aber das ist unbedeutend, der Algorithmus ist richtig, was wichtiger ist. – Valentin

+0

Ja, ich weiß, dass es geringfügig war - deshalb habe ich es kommentiert und abgestimmt :) –

1

Dies ist eine schnelle Schätzung, was ich aus Ihrer Frage extrapolieren kann. Es kann oder kann nicht korrekt sein:

var dc = new MyDataContext();  
var qry = from customer in dc.Customers 
      where customer.Orders.Description.Contains("special") 
      && customer.Orders.OrderDate > myMinDate 
      && customer.Orders.OrderDate < myMaxDate 
      order by customer.Orders.OrderDate ascending 
      select customer; 

Es soll durch eine Min- und Max-Datum durch ihre Auftragsdaten, gefiltert bestellten Kunden Objekte zurück. Diese beiden Zeilen können entfernt werden, wenn Sie nicht nach Datum filtern möchten.

Erwarten Sie die Kunden zu wiederholen. Wenn Sie nicht wiederholen möchten, fügen Sie eine group by-Klausel hinzu.

Viel Glück damit, berichten Sie, wie gut es funktioniert. :)

Edit:

Danke, Randolpho, das Problem ist, dass ich nicht myMinDate und myMaxDate. Ich muss in der Lage sein, die Beschreibung der ältesten Reihenfolge zu überprüfen. Ich habe das Gefühl, dass ich etwas wie c.Orders.Where (x => x.OrderDate.Max()) verwenden sollte, aber nicht die gesamte Abfrage richtig schreiben kann. Vielen Dank. - Valentin Vasiliev

Hmm ... Ich kann nicht sagen, wenn Sie die Kunden mit dem ältesten Auftrag wünschen und dass Sie die Beschreibung überprüfen wollen oder wenn Sie wollen die Kunden mit dem ältesten damit hat das Wort "special" in der Beschreibung der Bestellung.

Wenn Sie den Kunden mit dem ältesten Auftrag wollen und dann die Beschreibung überprüfen, können Sie etwas tun sollten:

var qry = from customer in dc.Customers 
      order by customer.Orders.OrderDate ascending 
      select new 
      { 
      CustomerData = customer, 
      OrderDescription = customer.Orders.Description 
      }; 
var oldest = qry.First(); 
if(oldest.OrderDescription.Contains("special")) 
{ 
    // do something 
} 

In diesem Szenario älteste ein neuer anonymer Typ ist, hat zwei Felder, CustomerData, die den Kunden mit der ältesten Bestellung enthält, und OrderDescription, die das Beschreibungsfeld der ältesten Bestellung enthält.

Auf der anderen Seite möchten Sie vielleicht die älteste Reihenfolge, die das Wort "Spezial" enthält. In diesem Fall sollten Sie etwas tun:

var qry = from customer in dc.Customers 
      where customer.Orders.Description.Contains("special") 
      order by customer.Orders.OrderDate ascending 
      select customer; 
var oldestCustomerWithSpecial = qry.First(); 

In diesem Szenario wird der Kunde mit dem ältesten Datensatz, der das Wort „speziellen“ in der Beschreibung enthält, ist in der Variable mit dem Namen oldestCustomerWithSpecial.

Ich glaube nicht, dass die Verwendung von Max on OrderDate Ihnen helfen wird. Sie sind fast immer besser dran, wenn Sie eine TOP-1-Anfrage nach Datum sortieren. Rufen Sie First() für die Abfrage auf.

+0

Danke, Randolpho, das Problem ist, dass ich nicht myMinDate und myMaxDate. Ich muss in der Lage sein, die Beschreibung der ältesten Reihenfolge zu überprüfen. Ich habe das Gefühl, dass ich etwas wie c.Orders.Where (x => x.OrderDate.Max()) verwenden sollte, aber nicht die gesamte Abfrage richtig schreiben kann. Vielen Dank. – Valentin

+0

Mein Fall ist der erste. Leider kompiliert es nicht, ich kann hier nicht auf OrderDate zugreifen: Bestellung nach Kunde.Orders.OrderDate aufsteigend, da Orders eine Collection ist. – Valentin

Verwandte Themen