簡體   English   中英

ASP.NET Core 6.0 MVC - 使用日期范圍對字符串進行排序

[英]ASP.NET Core 6.0 MVC - Sort a string with range of date

我想我正在接近我想要的,但我認為我可以使用一些幫助。

我發現如果我做order.by(x => x.Datum)日期會被排序,盡管到目前為止它是一個格式為yyyy/MM/dd的字符串,所以現在我決定將字符串擴展到一個日期范圍,像這樣: dd/MM/yyyy-dd/mm/yyyy

根據我的理解,我還可以使用DateTime.ParseExact將字符串轉換為日期時間對象,但會出現以下錯誤:

FormatException:DateTime 模式“d”以不同的值出現多次

不能將日期范圍存儲在datetime時間對象中嗎?

public IActionResult Termin() //Diese Methode zeigt die Termine an.
{
    var termin = _context.Termin
                         .Select(x => new ViewModelExposeTermin
                                          {
                                              Id = x.Id,    
                                              Name = x.Name,    
                                              Ort  = x.Ort,
                                              Datum = x.Datum,
                                              Uhrzeit = x.Uhrzeit
                                          })
                         .ToList()
                         .OrderBy(x => DateTime.ParseExact(x.Datum, "dd/MM/yyyy-dd/MM/yyyy", CultureInfo.CurrentCulture));

    return View(termin);
}

我不確定 sql 是否具有類似類型的數據范圍,而是可以使用 2 個日期時間字段。

public class TerminDatabaseModel
{
    /*
     * Some other properties
     */
    
    public DateTime Start { get; set; }
    public DateTime End { get; set; }
}

然后您可以創建自己的自定義DateTimeRange值類型,它應該實現IComparer<DateTimeRange>以便在 Linq 的OrderBy中使用。

public readonly struct DateTimeRange : IComparer<DateTimeRange>
{
    public DateTimeRange(DateTime start, DateTime end)
    {
        Start = start;
        End = end;
    }

    public DateTime Start { get; }
    public DateTime End { get; }
    public TimeSpan Duration => Start - End;
    
    // comparing implementation
    public int Compare(DateTimeRange x, DateTimeRange y)
    {
        return x.Duration.CompareTo(y.Duration);
    }

    /*
     * Other stuff
     */
}

並將其添加到您的 ViewModel

public class ViewModelExposeTermin
{
    /*
     * Some other properties
     */
    
    public DateTimeRange Datum { get; init; }
}

最后,將DateTime字段映射到DateTimeRange字段

var termin = _context.Termin
        .Select(x => new ViewModelExposeTermin
        {
            Id = x.Id,    
            Name = x.Name,    
            Ort  = x.Ort,
            Datum = new DateTimeRange(x.StartDateTime, x.EndDateTime),
            Uhrzeit = x.Uhrzeit
        })
        .ToList()
        .OrderBy(x => x.Datum);

    return View(termin);

筆記

在從數據庫中檢索數據之后進行排序。 要在查詢中執行排序,您必須在使用ToList獲取之前使用 EF 的OrderBy

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM