格式化是一个视图/消费者关注的问题,它不应该是一个领域。实体应该公开 DayPayAt 和 TimePayAt 作为它们各自的类型。 (DateTime 和 DateTime / Timespan)当您查询数据时,将其投影到 ViewModel/DTO,后者可以将这些值组合成 PayAt DateTime,然后让您的视图格式符合您的要求。
所以如果您的实体有:
public DateTime DayPayAt { get; set; }
public Timespan TimePayAt { get; set; }
您的查询将是:
var receipt = context.Receipts
.Where(/*conditions...*/)
.Select(x => new
{
// other fields or related data as needed.
x.Daypayat,
x.Timepayat
}).ToList() // Materialize our query...
.Select(x => new ReceiptViewModel
{
// Copy related data from results...
PayAt = x.DayPayAt.Add(x.Timepayat);
}).ToList();
然后在您的视图中,您可以使用您想要的任何自定义或标准格式字符串来格式化“PayAt”。例如,@Model.PayAt.ToString("g") 会为您提供您所在地区的标准短日期/时间格式,或者为特定内容使用自定义格式字符串。
上面的例子做了一个双重投影,一个是从我们的实体中获取感兴趣的原始字段,第二个是投影到视图模型。这可能不是必需的,具体取决于 EF 是否可以执行 DateTime.Add。 (我不相信)
如果实体中的 Timepayat 映射到 DateTime 字段(即 0000-00-00T14:20:00),那么 PayAt 转换将为:
PayAt = x.DayPayAt.Add(x.Timepayat.TimeOfDay);
如果您想返回实体并处理它,另一种方法是在构成 DateTime 的 PayAt 的 Receipt 实体上使用未映射的属性。该方法的注意事项是,您需要记住不要在 Linq 表达式中引用任何未映射的属性,因为它无法转换为 SQL。
public class Receipt
{
// Mapped properties...
public DateTime Daypayat { get; set; }
public TImespan Timepayat { get; set; }
[NotMapped]
public DateTime PayAt
{
get { return Daypayat.Add(Timepayat); }
}
}