簡體   English   中英

EF Core 2.2 - 如何使用 AT TIME ZONE SQL 片段創建 SqlExpression

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

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