Próbuję pobrać wartość DateTime, a jeśli nie jest pusta, zwraca krótki ciąg czasu. Moje zapytanie wygląda następująco: (czas nauki nie jest dopuszczalna wartość pusta, natomiast timeout NULLABLE)Dlaczego nie można rzucić null z datą jako ciąg w kwerendy LinQ?
var times = from t in db.TimePostings
where t.MemberID == member.MemberID
select new
{
Date = t.TimeIn.ToShortDateString(),
TimeIn = t.TimeIn.ToShortTimeString(),
TimeOut = t.TimeOut.HasValue ? t.TimeOut.Value.ToShortTimeString() : "-------"
};
gvTimePostings.DataSource = times;
gvTimePostings.DataBind();
ale to się nie powiedzie, gdy próbuję databind z błędem:
Could not translate expression 'Table(TimePosting).Where(t => (t.MemberID == Invoke(value(System.Func
1[System.String])))).Select(t => new <>f__AnonymousType8
4(Date = t.TimeIn.ToShortDateString(), TimeIn = t.TimeIn.ToShortTimeString(), TimeOut = IIF(t.TimeOut.HasValue, (t.TimeOut ?? Invoke(value(System.Func`1[System.DateTime]))).ToShortTimeString(), "-------"), Hours = ""))' into SQL and could not treat it as a local expression.
ja również uzyskać podobny błąd jeśli próbuję użyć:
TimeOut = t.TimeOut.HasValue ? Convert.ToDateTime(t.TimeOut).ToShortTimeString() : "-------"
jednak, jeśli zmienić właściwość timeout:
TimeOut = t.TimeOut.HasValue ? t.TimeOut.ToString() : "-------",
działa poprawnie, ale nie formatuje czasu tak, jak tego chcę (shortTimeString).
co się z tym dzieje?
Zakładam, że "AsEnumerable()" powoduje ten sam efekt jako "ToList()" w odpowiedzi Justina. Czy którakolwiek z metod jest "lepsza"? –
@ matthew_360: Nie całkiem ten sam efekt, nie - 'ToList()' musi zbudować listę wszystkich elementów, zamiast przesyłać je strumieniowo. To dobrze, jeśli zamierzasz używać 'times' w wielu miejscach bez buforowania *, które * powodują, ale poza tym nie widzę powodu do budowania bufora - osobiście użyłbym' AsEnumerable', który służy wyłącznie do celu chcesz: konwertowanie z 'IQueryable' na 'IEnumerable '. –