2016-08-02 5 views
-2

Seufz ... Auf meinem Grabstein wird es sagen: „Gestorben eine weitere Klausel einer LINQ-Abfrage hinzufügen“Umordnen der Klauseln in meinem LINQ?

So habe ich die folgenden:

var validStatuses = new[] { 
    "Assigned", "Donor Called", "Dispatched", "Waiting", 
    "Title Rec'd", "Sending Title", "Cancelled", "Waiting"}; 

var ud = db.Updates 
    .Where(c => !c.Sold && validStatuses.Contains(c.Status)) 
    .GroupBy(c => c.Vehicle) 
    .Select(x => x 
    .OrderByDescending(y => y.TimeStamp) 
    .First()) 
    .ToList(); 

Und ich habe gemerkt, dass ich die haben müssen Enthält die Klausel nach dem Datum. Mit anderen Worten, ich muss den letzten Eintrag nur auswählen, wenn dieser neueste Eintrag "validStatuses" enthält. Momentan gibt es mehrere Einträge zurück, solange jeder "validStatuses" enthält.

Ich wäre tief verschuldet für Hilfe ... danke!

+0

Und welches Problem (s) haben Sie die Abfrage entsprechend refactoring? – Servy

+0

_Ich muss den neuesten Eintrag nur dann auswählen, wenn dieser neueste Eintrag "validStatuses" enthält. _ - Was möchten Sie auswählen, wenn er keinen gültigen Status enthält? –

+0

Können Sie ein Beispiel für die Daten angeben, die Sie abfragen, die Ergebnisse, die Sie aktuell erhalten, und was Sie erhalten möchten. Ich bin mir nicht sicher, ob Sie für jedes Fahrzeug oder nur für ein Fahrzeug einen Eintrag wünschen. – juharr

Antwort

0

Mein Verständnis ist, dass dies funktionieren könnte (aber ich vermisste die neuesten Kommentare ...):

var ud = db.Updates 
       .Where(c => !c.Sold) 
       .GroupBy(c => c.Vehicle, x => x, (x,gr) => new { key = x, 
        list = gr.ToList().OrderByDescending(z => z.TimeStamp).First() }) 
       .Where(x=> validStatuses.Contains(x.list.Status)) 
       .Select(x => x.list).ToList(); 

Es ist eine Gruppe von Fahrzeug und es ist nur die Gruppen zu bewahren, wo der letzte Punkt a hat Gültiger Status ...

+0

Vielen Dank! Leider scheint es nicht ganz richtig. (Bitte d On't hate me ... Ich bin sehr müde) Nach der Abfrage mache ich ein Join auf die Ergebnisse und Ihre Abfrage scheint es zu brechen. Wenn Sie geneigt sind, weiter zu versuchen, mir zu helfen, folgt die ganze Sache: – PaulBinCT2

+0

@ PaulBinCT2 wirft es eine 'DoesNotWorkException'? –

+0

Ich sehe das Problem jetzt. Sie haben eine 'ToList', wo Sie sie nicht brauchen. –

1

Wie Sie in Ihrer Frage vorgeschlagen haben, verschieben Sie einfach die contains-Klausel nach Ihrem Datum.

var ud = db.Updates 
    .Where(c => !c.Sold) 
    .GroupBy(c => c.Vehicle) 
    .Select(x => x 
    .OrderByDescending(y => y.TimeStamp) 
    .First()) 
    .Where(c => validStatuses.Contains(c.Status)); 

Auch wenn Sie ud zur Verwendung auf der ganzen Linie in einer Linq-zu-Entitäten Abfrage planen, dann nicht konvertieren Sie Ihre Abfrage in eine Liste am Ende.