Entity Framework 4.0/如何从日期和时间连接字符串

Posted

技术标签:

【中文标题】Entity Framework 4.0/如何从日期和时间连接字符串【英文标题】:Entity Framework 4.0/ How to concatenate string from date and time 【发布时间】: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。分别格式化日期和时间,然后将这两个字符串连接起来。 【参考方案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); 
    

【讨论】:

以上是关于Entity Framework 4.0/如何从日期和时间连接字符串的主要内容,如果未能解决你的问题,请参考以下文章

Entity Framework 4.0、PoCo 和查找表的导航属性

Entity Framework 6 是不是支持 .NET 4.0?

在 .Net 3.5 应用程序中使用 Entity Framework 4.0 [重复]

ASP.NET MVC 4 + Entity Framework 6 + SQL Compact Edition 4.0 部署无需安装

AD0.NET Entity Framework 4.0 或 Linq-to-SQL

从哪里开始 .NET Entity Framework 和 ORM?