[英]EF Core 2.2 - how to create SqlExpression with AT TIME ZONE SQL fragment
我想將方法映射到自定義 SQL,即
CONVERT(datetime,
SWITCHOFFSET(GETUTCDATE(), DATEPART(TZOFFSET, GETUTCDATE() AT TIME ZONE 'Greenwich Standard Time')))
所以我在我的HasDbFunction
中添加了DbContext
:
modelBuilder.HasDbFunction(typeof(DbContext).GetMethod(nameof(DbContext.GetDateTime)))
.HasTranslation(e =>
{
var GETUTCDATE = new SqlFunctionExpression("GETUTCDATE", typeof(DateTime));
var TZOFFSET = new SqlFragmentExpression("TZOFFSET");
var ATTIMEZONE = new SqlFragmentExpression(" AT TIME ZONE ");
var GreenwichStandardTime = new Expression("Greenwich Standard Time"); // expression with constant?
var EXPRESSION = new Expression(GETUTCDATE, ATTIMEZONE, GreenwichStandardTime); // expression with combine multiple exprssions?
var DATEPART = new SqlFunctionExpression("DATEPART", typeof(int), new[] { TZOFFSET , EXPRESSION }); // cannot create
var SWITCHOFFSET = new SqlFunctionExpression("SWITCHOFFSET", typeof(DateTimeOffset), new[] { GETUTCDATE, DATEPART });
var DATETIME = new SqlFragmentExpression("DATETIME");
new SqlFunctionExpression("CONVERT", typeof(DateTime), new[] { DATETIME, SWITCHOFFSET });
});
我的問題是如何創建 GreenwichStandardTime 和 EXPRESSION?
從@Charlieface,我們可以從 SqlFragmentExpression 創建表達式
modelBuilder.HasDbFunction(typeof(DbContext).GetMethod(nameof(DbContext.GetDateTime)))
.HasTranslation(e =>
{
var DATETIME = new SqlFragmentExpression("DATETIME");
var SWITCHOFFSET= new SqlFragmentExpression(
$@" SWITCHOFFSET(GETUTCDATE(),
DATEPART(TZOFFSET, GETUTCDATE()
AT TIME ZONE 'Greenwich Standard Time')) ");
return new SqlFunctionExpression("CONVERT", typeof(string), new[] { DATETIME , SWITCHOFFSET });
});
如果我想用函數參數替換“格林威治標准時間”作為@Charlieface 使用
modelBuilder.HasDbFunction(typeof(DbContext).GetMethod(nameof(DbContext.GetDateTime), new[] {typeof(string)}))
.HasTranslation(e =>
{
var constantExpression = e.First() as ConstantExpression;
var DATETIME = new SqlFragmentExpression("DATETIME");
var SWITCHOFFSET= new SqlFragmentExpression(
$@" SWITCHOFFSET(GETUTCDATE(),
DATEPART(TZOFFSET, GETUTCDATE()
AT TIME ZONE '{constantExpression.Value}')) ");
return new SqlFunctionExpression("CONVERT", typeof(string), new[] { DATETIME , SWITCHOFFSET });
});
public DateTime GetDateTime([NotParameterized] string timeZone){
throw new NotImplementedException()
}
[NotParameterized] 不會將其轉換為表達式上的參數
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.