簡體   English   中英

使用 ConvertUsing 到 map 並使用 SqlFunctions 進行投影

[英]Using ConvertUsing to map and to project with SqlFunctions

我正在將一個 .NET Framework 項目從 Automapper 4.1.1 升級到 Automapper 10.0.0,我遇到了一個我無法解決的問題。 我看到 ConvertUsing 和 ProjectUsing 已經統一,但不知何故我必須能夠判斷是否正在完成映射或項目。 我有一個配置,以便在將 DateTime 更改為 int 時普遍應用它,以便它通過計算分鍾數進行轉換。 我需要使用 SqlFunctions 進行轉換,但僅當我們進行投影時,當我們進行映射時,才必須通過簡單的轉換來完成。 如果你現在只能有一個 ConvertUsing,你怎么能做到這一點?

       CreateMap<DateTime?, int>().ConvertUsing(x => x.HasValue ? System.Data.Entity.SqlServer.SqlFunctions.DatePart("HOUR", x.Value).Value * 60 + System.Data.Entity.SqlServer.SqlFunctions.DatePart("MINUTE", x.Value).Value : 0); CreateMap<DateTime, int>().ConvertUsing(x => System.Data.Entity.SqlServer.SqlFunctions.DatePart("HOUR", x).Value * 60 + System.Data.Entity.SqlServer.SqlFunctions.DatePart("MINUTE", x).Value); CreateMap<DateTime?, int>().ConvertUsing(x => Convert.ToInt32(x.HasValue ? x.Value.TimeOfDay.TotalMinutes : 0)); CreateMap<DateTime, int>().ConvertUsing(x => Convert.ToInt32(x.TimeOfDay.TotalMinutes));

我嘗試使用 ProjectUsing 或在 ConvertUsing 中尋找一個參數,它告訴我是否正在轉換 IQueryable 但它似乎不存在

您可以創建自定義 DB function(使用例如 CodeFirstFunctions 或 EntityFramework.Functions package 允許創建自定義函數)並提供此 function 的正文(示例):

[Function(FunctionType.ComposableScalarValuedFunction, nameof(SecondsDiff), Schema = "dbo")]
[return: Parameter(DbType = "int")]
public static int? SecondsDiff([Parameter(DbType = "date")] DateTime? date1, [Parameter(DbType = "date")] DateTime? date2)
{
    if (date1 == null || date2 == null)
    {
        return null;
    }

    DateTime a = date1.Value;
    DateTime b = date2.Value;

    if (a >= b)
    {
        return (int?)(b - a).TotalSeconds;
    }

    return -(int?)(a - b).TotalSeconds;
}

它將在兩種模式下工作。

暫無
暫無

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

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