【发布时间】:2021-12-08 05:47:49
【问题描述】:
我现在正在做一个 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 更多的课程。
例如,如果我的第一个Course的总EpisodeTimeLength为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”!
所以任何人都可以告诉我如何处理它?
【问题讨论】:
-
你试过
c => c.Episodes.Sum(e => e.EpisodeTimeLength.Ticks)吗? -
是的,我有,但它说“不包含 'Ticks' 的定义”
-
@juharr 评论似乎是正确的。只需添加空检查,因为我在您的课程中看到 EpisodeTimeLength 可以为空,所以:
c => c.Episodes.Sum(e => e.EpisodeTimeLength?.Ticks ?? 0) -
您可能必须在客户端进行订购。尝试在
OrderBy之前放置一个AsEnumerable。如果您当时正在执行First或Take之类的操作,那当然不是一个好主意。 -
@YomB 有一个版本的
Sum可以处理long,最好使用TotalSeconds,因为Seconds是整分钟、小时和天的秒数被截断。归根结底,这个问题更多地与将代码翻译成 SQL 有关。
标签: c# linq asp.net-core timespan