【问题标题】:Entity Framework 4.0/ How to concatenate string from date and timeEntity Framework 4.0/如何从日期和时间连接字符串
【发布时间】:2021-12-26 12:19:55
【问题描述】:

我有这张桌子

CREATE TABLE Receipt
(
    id INT IDENTITY(1,1) NOT NULL PRIMARY KEY,
    idcustom INT NOT NULL,
    idstaff INT NOT NULL,
    Daypayat DATE NOT NULL,
    Timepayat TIME NOT NULL,
    total INT NOT NULL
)

我想将 Daypayat 与 Timepayat 连接起来,例如 DateTime (dd/MM/yyyy hh:mm)

【问题讨论】:

  • 那是 SQL,而不是 C#/entity 框架。你能展示一下你到目前为止所做的尝试吗?
  • @PeterSmith 是的,我知道我的意思是使用实体框架在 c# 中连接字符串 2 列 Daypayat、Timepayat
  • datetime格式here。分别格式化日期和时间,然后将这两个字符串连接起来。

标签: c# winforms entity-framework


【解决方案1】:

首先使用以下方法进行连接并将结果保存在SQL中的特定列中。

select cast(@date+' '+@time  as datetime)

或者你可以这样做来转换,

select cast(@date as datetime)+@time

然后在 C# 中使用 Datetime 结构来获取结果。

【讨论】:

    【解决方案2】:

    格式化是一个视图/消费者关注的问题,它不应该是一个领域。实体应该公开 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); }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-15
      • 2014-02-17
      • 2018-05-08
      • 2015-06-09
      • 1970-01-01
      • 2011-10-24
      相关资源
      最近更新 更多