Ja Linq kann dies tun, aber Sie müssen eine Startsequenz haben, auf der die linq funktionieren sollte. Normalerweise hat diese Sequenz den gleichen Typ wie Ihre Tabelle, in Ihrem Fall Verfügbarkeit.
Von Ihrem SQL entnehme ich, dass jeder Datensatz in der Verfügbarkeit Tabelle zumindest Eigenschaften Id, FrameID und Datum:
class Availability
{
public int Id {get; set;}
public int FrameId {get; set;
public DateTime Date {get; set;}
}
Natürlich kann dies auch ein anonymer Typ sein. Die Bedeutung ist, dass Sie irgendwie eine Folge von Elementen haben, die diese Eigenschaften:
IQueryable<Availability> availabilities = ...
Sie schrieb:
Ich brauche nur einen Datensatz (mit max Datum Insert) für jeden FrameID
So hat jede Verfügbarkeit eine FrameId, und Sie wollen für jede FrameId den Datensatz mit dem höchsten Datumswert.
Sie könnten Enumerable.GroupBy und Gruppe von FrameID verwenden
var groupsWithSameFrameId = availabilities.GroupBy(availability => availability.FrameId);
Das Ergebnis ist eine Folge von Gruppen. Jede Gruppe enthält die Reihenfolge aller Verfügbarkeiten mit derselben FrameId. Mit anderen Worten: Wenn Sie eine Gruppe verwenden, haben Sie eine group.Key mit einem FrameId-Wert und einer Sequenz aller Verfügbarkeiten, die diesen FrameId-Wert haben.
Wir werden den group.Key nicht verwenden. Wenn Sie die Reihenfolge der Elemente in jeder Gruppe der Sortierreihenfolge nach Datum und nehmen das erste Element in absteigender Reihenfolge, werden Sie das Datum mit dem höchsten Wert haben
var recordWithMaxDateOfInsert = groupsWithSameFrameId
.Select(group => group.OrderByDescending(groupElement => groupElement.Date)
.First();
Aus jeder Gruppe sortiert alle Elemente der Gruppe durch absteigend Datumswert und nehmen Sie das erste Element der sortierten Gruppe.
Ergebnis: von Ihren ursprünglichen Verfügbarkeiten haben Sie für jeden Rahmen die Verfügbarkeit mit dem höchsten Wert für das Datum.
Was ist der Punkt der Unterabfrage hier? –
Ich brauche nur einen Datensatz (mit maximalem Datum der Einfügung) für jede FrameID – user3550149
Das Ergreifen einer Entität durch eine ID wäre so einfach wie: entity = context.Table.Find (id); in Linq. Fehle ich etwas? –