2016-04-21 13 views
3
public List<DateTime> CalorieDates(int patientId) 
    { 
     using (var db = new DbConn()) 
     { 
      List<DateTime> query = 
       db.Calories.Where(d => d.PatientId == patientId && d.FoodId != "initial" && d.DateOfEntry != null) 
        .Select(d => System.Data.Entity.DbFunctions.TruncateTime(d.DateOfEntry)).Distinct().ToList(); 

      return query; 
     } 

    } 

Warum wird meine Liste in Nullzeiten umgestellt?Verkürzen der Zeit Umwandeln der Liste in Nullwerte

Error CS0029 Cannot implicitly convert type 
'System.Collections.Generic.List<System.DateTime?>' 
to 'System.Collections.Generic.List<System.DateTime>' 

Wie verhindere ich das? Ich möchte keine Liste mit nullbaren Datumsangaben.

+3

Vermutlich weil das; s, was 'TruncateTime()' zurückgibt. – stuartd

+1

Insert '.Value' nach' TruncateTime (d.DateOfEntry) ' –

+0

@IvanStoev' GetValueOrDefault() 'ist vorzuziehen, da Null-Referenz-Exceptions vermieden werden, wenn einer der Werte null ist – stuartd

Antwort

5

Aus unbekannten Gründen (wahrscheinlich die Abfrage-Provider das Leben leichter zu machen), ist DbFunctions Klasse nicht bieten getrennte TruncateTime Überlastungen für DateTime und DateTime?, aber einzelne Methode mit DateTime? Argument, das beide Fälle behandelt. Als Nebeneffekt ändert sich jedoch der Ausdruckstyp in DateTime?, selbst wenn das Argument DateTime ist (wie es in Ihrem Fall zu sein scheint).

Also müssen Sie das korrigieren. Sobald Sie wissen, dass Sie immer passieren DateTime (das Ergebnis kann nicht null sein), können Sie einfach .Value am Ende der TruncateTime Anruf hinzufügen und das Problem ist gelöst.

.Select(d => System.Data.Entity.DbFunctions.TruncateTime(d.DateOfEntry).Value) 
0
.Select(d => System.Data.Entity.DbFunctions.TruncateTime(d.DateOfEntry)) 
.Distinct().ToList().Cast<List<DateTime>>() 
0

Wie @stuartd sagt in den Kommentaren, TruncateTime wahrscheinlich DateTime? zurückkehrt; Ihre Select gibt IEnumerable<DateTime?> zurück, weil das ist, was Ihr Lambda es von TruncateTime gibt, Distinct() gibt das selbe zurück, und ToList() wandelt es in List<DateTime?> um, weil, das ist, was IEnumerable<DateTime?>.ToList() zurückgibt.

Sie enden also mit einer Liste von DateTime?. Das ist einfach. Wenn Sie das nicht wollen, Select etwas anderes.

Nun gehe ich davon aus, dass TruncateTime einen Nulllabeltyp zurückgibt, weil es null zurückgeben kann. Ich nehme an, dass der Parameter DateTime? lautet und nur null zurückgibt, wenn Sie eine Null übergeben. Da Sie eine Struktur übergeben, kann sie in Ihrer speziellen Verwendung wahrscheinlich keine Null zurückgeben, aber ich weiß es nicht, also werde ich auf Nummer sicher gehen.

Sie möchten also Ihre Aufzählung der nullbaren Datumsangaben in normale umwandeln, ohne Null-Null-Werte in reguläre DateTime zu schreiben. Also filtern Sie zuerst zu denjenigen, die nicht null sind, und wählen Sie dann deren Werte aus.

.Select(d => System.Data.Entity.DbFunctions.TruncateTime(d.DateOfEntry)) 
    .Where(d => d.HasValue) 
    .Select(d => d.Value) 
    .ToList(); 
-1

Es sieht aus wie die DB-Methode rufen Sie die Datetime einfach removes the time portion

trunkieren Wenn das der Fall ist, dann stattdessen die folgenden verwenden.

List<DateTime> query = db.Calories.Where(d => d.PatientId == patientId && d.FoodId != "initial" && d.DateOfEntry != null) 
       .Select(d => d.DateOfEntry.Date).Distinct().ToList(); 
+0

Das war das erste, was ich getan habe, es funktioniert nicht, deshalb musste ich Truncate benutzen. – prospector

Verwandte Themen