kann ich eine Hand erhalten, die das Folgende in eine LINQ-Anweisung konvertiert.Konvertieren einer SQL-Anweisung in LINQ-To-SQL
SELECT reports.* FROM [dbo].[ReportLists] rl
INNER JOIN [dbo].[ReportItems] ri ON rl.Id = ri.ReportListId
INNER JOIN [dbo].[Reports] reports ON ri.Id = reports.ReportItemId
WHERE
reports.createdDate
IN (
SELECT
MAX(report_max_dates.createdDate)
FROM
[dbo].[Reports] report_max_dates
GROUP BY
report_max_dates.seedLot
)
Zur Zeit habe ich es so weit nach unten:
db.ReportLists.Select(rl => db.ReportItems
.Where(ri => ri.ReportListId == rl.Id)
.Select(ri => db.Reports
.Where(r => r.ReportItemId == ri.Id)
.GroupBy(r => new { r.seedLot })
.Select(g => g.OrderByDescending(x => x.createdDate).FirstOrDefault())));
Das Problem mit dem oben LINQ ist, dass es Einträge zurückgibt, der Titel geändert haben. Innerhalb der Datenbank behalte ich den Verlauf aller Datensätze (daher die Notwendigkeit, dass der erste in der createdDate Reihenfolge absteigend ist. Wenn ich einen Bericht von Titel x in Titel y ändere, erscheint er unter beiden Titeln, wenn ich nur den aktuellsten Datensatz haben möchte daher der einer unter dem Titel y sein.
EDIT Sorry für den Mangel an Details. ich habe eine Bericht Tabelle, die Informationen über den Bericht hält (seedlot eine Kennung ist). Jedes Mal, wenn ein Bericht bearbeitet wird, einen neuen Rekord (In diesem Fall gibt der maximale Eintrag für das createdDate an, dass der Bericht der aktuellste anzuzeigende Datensatz ist. Die Berichte werden dann in Titel oder ReportItems gruppiert. Diese Berichtselemente werden dann gruppiert Halten Sie den Titel und die zugehörigen Berichte.Diese reportItems werden in einer ReportList wie th gehalten at Ich kann den JSON in einem gewünschten Format ausdrucken und enthält nur eine Statusspalte und eine ID, auf die die ReportItems verweisen.
Wenn ein Bericht von Titel a nach Titel b verschoben wird, wird ein neuer Datensatz mit dem Titel-Fremdschlüssel eingegeben, der mit dem Titel verknüpft ist, in den er geändert wurde. Wenn dies geschieht, gibt der oben angegebene LINQ den Datensatz unter jedem einzelnen ReportItem zurück, wenn er nur den neuesten Eintrag für Titel b zurückgeben soll (aus dem obigen Beispiel). Darüber hinaus gibt die LINQ-Anweisung nur den neuesten Datensatz für das createdDate zurück.
Hier sind meine Klassenstrukturen (die die DB-Struktur als auch nachahmen)
public class ReportList {
public int Id {get;set;}
public string status {get;set;}
public List<ReportItem> {get;set;}
}
public class ReportItem {
public int Id {get;set}
public string title {get;set;}
public List<Report> {get;set;}
}
public class Report {
public int Id {get;set;}
public string Lot {get;set;}
... Other data ...
public DateTime createdDate {get;set;}
}
Danke, Dman
Also bin ich richtig zu verstehen, dass seed_lot unterscheidet wirklich unterschiedliche Berichte voneinander * und * berichtet, dass eine Namensänderung aufgetreten sind? Das heißt, soweit report_max_dates gilt, unterscheidet sich ein umbenannter Bericht nicht von wirklich unterschiedlichen (nicht verwandten) Berichten? –
Bitte geben Sie mehr Details. Erkläre, was du willst. Es ist schwierig, dies aus einem SQL-Snippet und einer fehlerhaften linq-Abfrage abzuleiten. Und erklären Sie, wie Sie die verschiedenen Versionen eines Berichts zusammenhalten. –
Es scheint mir, dass Sie eine Kette von Update-Datensätzen durchqueren müssen, um die * neueste * Version eines Reports basierend auf seinem seed_lot bei Inkarnation zu erhalten, was die LINQ-Version dieser (viel?) Schwieriger als es zunächst erscheinen könnte . –