簡體   English   中英

Entity Framework 4.0/ 如何從日期和時間連接字符串

[英]Entity Framework 4.0/ How to concatenate string from date and time

我有這張桌子

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中的特定列中。

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

或者你可以這樣做來轉換,

select cast(@date as datetime)+@time

然后在 C# 中使用 Datetime 結構來獲取結果。

格式化是一個視圖/消費者關注的問題,它不應該是一個域的。 實體應該公開 DayPayAt 和 TimePayAt 作為它們各自的類型。 (日期時間和日期時間/時間跨度)當您查詢數據時,將其投影到 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); }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM