我現在正在做一個 Asp.Net Core 專案。我有一個名為Course的物體和一個名為Episode. 它們是一對多的關系,因此每個內部Course都有很多Episods。
這是我的 Episode.cs:
public class Episode
{
[Key]
public int EpisodeId { get; set; }
[Required]
public int CourseId { get; set; }
[Display(Name = "????? ??????")]
[Required(ErrorMessage ="???? {0} ?? ???? ????")]
[MaxLength(ErrorMessage ="{0} ???????? ??? ?? ?? {1}??????? ????")]
public string EpisodeTitle { get; set; }
public string EpisodeFileName { get; set; }
[Display(Name = "??? ???? ??????")]
[Required(ErrorMessage = "???? {0} ?? ???? ????")]
public TimeSpan? EpisodeTimeLength { get; set; }
[Display(Name = "??????")]
[Required(ErrorMessage = "???? {0} ?? ???? ????")]
public bool IsFree { get; set; }
public DateTime CreateDate { get; set; } = DateTime.Now;
#region Navigation Properties
[ForeignKey("CourseId")]
public Course.Courses.Course Course { get; set; }
#endregion
}
我的問題是關于這部分:public TimeSpan? EpisodeTimeLength { get; set; }.
我想使用OrderBy()方法對我的課程進行排序,以便哪個課程具有更多的總EpisodeTimeLength。
例如,如果我的第一個的總EpisodeTimeLengthCourse是 12h,第二個是 15h,那么將首先考慮第二個。
我嘗試了以下方法:
1- dbContext.Courses.OrderBy( c => new TimeSpan( c.Episodes.Sum(e=> e.EpisodeTimeLength.Ticks));
2- dbContext.Courses.OrderBy( c =>( c.Episodes.Sum(e=> e.EpisodeTimeLength));
但他們都沒有作業,我得到了錯誤:無法隱式轉換型別 'System.TimeSpan' 到 'long'!
So anyone can tell me How I can handle it?
uj5u.com熱心網友回復:
您的 TimeSpan 變數可以為空,因此您需要在運算式中使用 Value 并且不需要在 LINQ 方法中創建 TimeSpan 物件。此代碼應該作業:
dbContext.Courses.OrderBy( c => c.Episodes.Sum(e=> e.EpisodeTimeLength.Value.Ticks));
uj5u.com熱心網友回復:
由于TimeSpan已經定義了operator ,您可以使用它。嘗試這個:
.OrderBy(c => c.Episodes.Select(e => e.EpisodeTimeLength.Value)
.Aggregate(TimeSpan.Zero, (x, y) => x y))
這首先將所有劇集投影到Value它們的長度上(假設您想要一個錯誤的例外,如果劇集長度沒有價值),然后使用內置 運算子進行聚合。
如果您不想要例外,但想在不知道長度時使用零長度,則:
.OrderBy(c => c.Episodes.Select(e => e.EpisodeTimeLength ?? TimeSpan.Zero)
.Aggregate(TimeSpan.Zero, (x, y) => x y))
如果您絕對確定每門課程中總會有至少一集c,那么您可以TimeSpan.Zero從Aggregate呼叫中省略(第二行)。所以那將是
.OrderBy(c => c.Episodes.Select(e => e.EpisodeTimeLength.Value)
.Aggregate((x, y) => x y))
分別
.OrderBy(c => c.Episodes.Select(e => e.EpisodeTimeLength ?? TimeSpan.Zero)
.Aggregate((x, y) => x y))
最后,您可能需要這樣的邏輯:如果至少一集缺少長度,則總數應該是未定義的 ( null)。在這種情況下,使用在 上自動存在的提升Nullable<>。那將是:
.OrderBy(c => c.Episodes.Select(e => e.EpisodeTimeLength)
.Aggregate((TimeSpan?)TimeSpan.Zero, (x, y) => x y))
或者:
.OrderBy(c => c.Episodes.Select(e => e.EpisodeTimeLength)
.Aggregate((x, y) => x y))
如果您知道.Episodes不為空,并且在這些情況下,您將在最短課程之前自行排序“未定義”總長度的所有課程。
當然.Select并不是嚴格需要的,因為它們可以內置到 使用的 lambda 中.Aggregate,例如:
.OrderBy(c => c.Episodes
.Aggregate((TimeSpan?)TimeSpan.Zero, (x, y) => x.EpisodeTimeLength y.EpisodeTimeLength))
好吧,既然這.OrderBy就是您所要求的,那么您不妨按照.TicksfatherOfWine 的好小答案所建議的那樣使用。但是,我在您對他的回答的評論中看到,您可能希望保留課程總長度。在這種情況下,您可以只說.Select而不是.OrderBy,例如:
var allCourseLengths = dbContext.Courses
.Select(c => c.Episodes.Select(e => e.EpisodeTimeLength.Value)
.Aggregate(TimeSpan.Zero, (x, y) => x y));
等等。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/329747.html
標籤:c# linq asp.net-core timespan
上一篇:模擬存盤庫回傳null
