Ein Anfänger-Entity Framework-Abfrage, die zum Auffüllen einer WinForms-ListView
Ich habe gerade angefangen zu lernen, wie man das Entity Framework zu schreiben ein sehr einfaches C# - Netzwerk-monitoring-Programm - dies ist ein Lern-übung, um zu versuchen und "drive home" was habe ich nur darüber gelesen bisher. Ich bin auch neu in C# und LINQ (um nur die Dinge zu komplizieren weiter.)
Ich glaube, ich habe das Datenmodell entsprechend normalisiert, aber ich könnte falsch sein. Visual Studio generiert ein konzeptionelles Modell, das aussieht, OK. Ich habe pluralisierten der Verbände und EntitySets, wo notwendig, aber ich bin kämpfen, um durchzuführen, was ich denke, ist eine Recht einfache Abfrage/Projektion auf die Daten.
Die Datenbank enthält 3 Tabellen:
[Server] - A server defined by the user that should be pinged.
ServerID - primary key
HostAddress - IP or hostname
[Result] - A result containing data about the last server test
ResultID - primary key
ServerID - foreign key on [Server].[ServerID]
StateID - an integer used to lookup one of 3 possible Server states
TimeStamp - Time stamp of last ping
[State] - A lookup table containing an integer -> string mapping.
StateID - a unique key
StateLabel - human-readable string like "unreachable" or "OK" or "timeout"
Habe ich manuell aufgefüllt, die Datenbank mit ein paar einfachen Einträgen, gerade genug, um geben Sie mir etwas, mit zu arbeiten.
Für den Anfang würde ich mag zu präsentieren, die alle Ergebnis-Daten in ein ListView auf einer WinForm. Die Listenansicht enthält die folgenden statischen Spalten:
Staat | Server-Adresse | Zuletzt überprüft
In der Theorie, die ListView-Daten müssen erzeugt werden, durch Projektion(?) in jeder der 3 Tabellen:
- Der "Status" - Spalte angezeigt werden sollen, die den Menschen lesbaren [Status].[StateLabel] verlinkt [Ergebnis].[StateID]
- Die "Server-Adresse" die Spalte angezeigt werden soll [Server].[HostAddress] verlinkt [Ergebnis].[ServerID]
- Die "Last Checked" - Spalte angezeigt werden soll [Ergebnis].[TimeStamp]
Da habe ich keine Notwendigkeit für das Objekt Eintritt und/oder change-tracking-Funktionen von ObjectServices, bin ich Recht in der Annahme, es wäre effizienter/korrekt zu verwenden, Entity SQL, EntityClient-und DbDataReader? Wenn ja, was wäre ein geeignetes Entity-SQL-Abfrage Aussehen?
Für was es Wert ist, ich habe versucht, mithilfe von LINQ to Entities und anonyme Typen in einer Methode, wurde aber vereitelt durch einen Mangel an Verständnis auf einen geeigneten Rückgabetyp:
var results = from r in _context.Result
select new
{
State = (from s in _context.State
where s.StateId == r.StateId
select s.StateLabel),
r.ServerReference.Value.HostAddress,
r.TimeStamp
};
return results.ToList(); //<- No can do.
Vielen Dank für Ihre Hilfe!
Steve
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sowie Sie werden nicht in der Lage, um eine Liste von anonymen Typen, es sei denn, Sie warf Sie zu
object
und haben die Signatur definieren, die den Rückgabetyp-wieList<object>
(oder Schnittstelle). Ihre andere Problem ist, dass die Unterabfrage für den Staat eigentlich eine RückkehrIQueryable
anstatt einen einzigen Eintrag (Sie können dieFirst
- Erweiterung-Methode mit EF, um das erste übereinstimmende Element.) Obwohl, wenn Sie die foreign key-Beziehung das Modell haben sollte, das setup eines Navigations-Eigenschaft für den Staat als gut, und Sie sollten in der Lage sein, um die Nutzung der Immobilie angebracht anstelle einer Unterabfrage. Also, wenn Sie möchten, um dieses als eine Methode aufrufen, gibt eine Liste von Objekten, die Sie erstellen, eine Art, die für die Transformation oder niedergeschlagen zu widersprechen. Sonst könnten Sie es tun, auf der Ebene (dies hängt alles von Ihren Bedürfnissen), wo Sie versuchen, binden Sie die Liste.Und wie ich sagte, die andere alternative ist, entweder erstellen Sie eine Klasse für die Transformation oder binden Sie die Liste direkt an die Abfrage.
Dann fügen Sie einfach die Klasse, um die
select new
alaselect new SimpleStuff
und ändern Sie die Signatur der Methode zu reflektieren, die Klasse und das entfernen der Besetzung, die Rückkehr.