2009-07-28 8 views
3

Ich bin neu bei LINQ und ich mag es bisher, aber ich versuche, in einigen Formen laden, indem Sie einen einzigen Datensatz (Student). Wenn diese nicht vorhanden ist want't I Standardwerte d leere Strings falsch bools ...LINQ einzelnen Formularen oder Standardeinstellungen, wenn kein Datensatz

so verwendet I:

db = new DataClassesDataContext();   
student = db.ss_students.SingleOrDefault(p => p.student_id == studentID); 
txtRegNumber.EditValue = student.car_reg_no; 

Diese auf die Zuweisung von student.car_reg_no fehlgeschlagen. Mir wurde klar, dass ich die SingleOrDefault-Methode scheinbar falsch verstanden habe, und sie gibt für den Schüler null zurück, wenn er keinen Datensatz finden kann. Ich dachte aus irgendeinem Grund, dass es die Standardwerte für jedes der Felder wie student.car_reg_no zurückgeben würde. Ich denke, ich denke immer noch im Datenbankmodus.

Dies ist kein Problem, das ich Code wie folgt tun:

db = new DataClassesDataContext();   
student = db.ss_students.SingleOrDefault(p => p.student_id == studentID); 
if (student != null) 
{ 
     txtRegNumber.Text = student.car_reg_no; 
     //assign more control values 
} 

Und die Standardwerte könnten entweder auf die Steuerelemente auf dem Formular in einem anderen oder zugewiesen direkt zugeordnet werden.

Aber ist das der richtige Weg, oder fehlt mir etwas?

BEARBEITEN Danke für die Beiträge bis jetzt habe ich den Ansatz von Marc Gravell vorgeschlagen. Ich bin jetzt ein bisschen weitergekommen.

Ich versuche jetzt, die Daten zurück in die Datenbank zu speichern, woher würde ich wissen, wenn ich einen Datensatz aktualisiere oder einfüge. Sollte ich Bools hinzufügen, um das selbst aufzunehmen oder ist es ein eingebauter Weg?

Antwort

9

SingleOrDefault gibt den Standardwert für den zurückgegebenen Typ zurück. Welche ist

  • null für Klassen/Schnittstellen/Delegierten
  • 0/false für Werttypen
    • Ausnahme Nullable<T>, wo es
    • null ist

Für Klassen, Sie Nullen erhalten - dies ist hauptsächlich eine Möglichkeit zu überprüfen, ob es existiert? vielleicht schafft nur die ihnen tatsächlichen Standard ...:

YourType x = query.SingleOrDefault() ?? new YourType(); 

Dieser „null Koaleszierstruktur“ Ansatz führt nur die rechte-Seite (new ...), wenn die linke Seite null ist. Oder einfacher:

YourType x = query.SingleOrDefault(); 
if(x==null) { // use a default 
    x = new YourType(); 
} 
+0

'FirstOrDefault' wäre * etwas * billiger, wenn die IDs niemals dupliziert werden können. 'SingleOrDefault' überprüft dies jedes Mal. (Dies ist kein Problem mit Ihrer Antwort, es ist ein Kommentar für den Fall, dass das OP eine unnötige Validierung in der Antwort angefordert hat.) –

+0

Danke, es auf diese Weise zu tun, haben gerade eine Bearbeitung hinzugefügt, um es im selben Beitrag für andere zu halten. Was passiert, wenn ich die Daten speichern will, muss ich nicht wissen, ob es (in SQL-Begriffen) ein Einfüge- oder ein Aktualisierungsbefehl ist. – PeteT

+0

Da dies LINQ-to-SQL ist, ist der schlimmste Fall, dass es zwei Zeilen aus der Datenbank lesen muss, bevor die Ausnahme ausgelöst wird ... –

Verwandte Themen