[英]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.