erp-platform/api/src/Erp.Platform.Domain/Queries/QueryHelper.cs

146 lines
5.2 KiB
C#
Raw Normal View History

2025-05-06 06:45:49 +00:00
using System;
using System.Data;
2025-10-22 12:16:34 +00:00
using System.Globalization;
2025-05-06 06:45:49 +00:00
using System.Linq;
using System.Text.Json;
2025-11-11 19:49:52 +00:00
namespace Erp.Platform.Queries;
2025-05-06 06:45:49 +00:00
public class QueryHelper
{
/// <summary> gelen parametrelere gore [Value] yada 'Value' seklinde sonuc dondurur
/// </summary>
/// <param name="fieldDbSource"></param>
/// <param name="value"></param>
/// <returns></returns>
public static object GetFormattedValue(DbType fieldDbSource, object value)
{
object[] values = null;
var isArray = false;
if (value is JsonElement valueJson && valueJson.ValueKind == JsonValueKind.Array)
{
values = valueJson.EnumerateArray().Select(a => (object)a).ToArray();
isArray = true;
}
else if (value is object[] valueArray)
{
values = [.. valueArray];
isArray = true;
}
else
{
values = [value];
}
switch (fieldDbSource)
{
case DbType.Guid:
var guidValues = values.Select(a =>
{
if (a == null)
return (Guid?)null;
var str = a.ToString();
if (string.IsNullOrWhiteSpace(str))
return (Guid?)null;
return Guid.TryParse(str, out var g) ? g : (Guid?)null;
}).ToArray();
2025-05-06 06:45:49 +00:00
value = isArray ? guidValues : guidValues[0];
break;
case DbType.String:
case DbType.AnsiString:
var strValues = values.Select(a => a?.ToString()).ToArray();
value = string.Join(PlatformConsts.MultiValueDelimiter, strValues);
break;
case DbType.Date:
case DbType.DateTime:
case DbType.DateTime2:
case DbType.DateTimeOffset:
2025-10-22 12:16:34 +00:00
var dateTimeValues = values.Select(a =>
{
if (a == null) return (DateTimeOffset?)null;
var s = a as string ?? a.ToString();
if (string.IsNullOrWhiteSpace(s)) return (DateTimeOffset?)null;
2025-10-26 20:27:01 +00:00
// 🔹 Kabul edilen olası tarih formatları (tüm dillerde yaygın)
var possibleFormats = new[]
{
"yyyy-MM-dd",
"dd.MM.yyyy",
"dd/MM/yyyy",
"MM/dd/yyyy",
"yyyy/MM/dd",
"yyyy-MM-ddTHH:mm:ss",
"yyyy-MM-ddTHH:mm:ss.fff",
"yyyy-MM-ddTHH:mm:ssZ",
"yyyy-MM-dd HH:mm:ss",
"dd.MM.yyyy HH:mm:ss",
"dd/MM/yyyy HH:mm:ss",
"MM/dd/yyyy HH:mm:ss"
};
// 🔹 1. Önce ISO / Invariant formatları dene
if (DateTimeOffset.TryParseExact(s, possibleFormats,
CultureInfo.InvariantCulture,
DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal,
out var dto))
{
return dto.ToUniversalTime();
}
// 🔹 2. Eğer olmadıysa kültür bağımlı genel parse denemesi
if (DateTimeOffset.TryParse(s, CultureInfo.CurrentCulture, DateTimeStyles.AssumeLocal, out dto))
{
2025-10-22 12:16:34 +00:00
return dto.ToUniversalTime();
2025-10-26 20:27:01 +00:00
}
2025-10-22 12:16:34 +00:00
2025-10-26 20:27:01 +00:00
// 🔹 3. Son çare: system culture veya ISO fallback
if (DateTimeOffset.TryParse(s, CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal, out dto))
{
2025-10-22 12:16:34 +00:00
return dto.ToUniversalTime();
2025-10-26 20:27:01 +00:00
}
2025-10-22 12:16:34 +00:00
2025-10-26 20:27:01 +00:00
// 🔹 Parse edilemezse null
2025-10-22 12:16:34 +00:00
return (DateTimeOffset?)null;
}).ToArray();
2025-10-26 20:27:01 +00:00
2025-05-06 06:45:49 +00:00
value = isArray ? dateTimeValues : dateTimeValues[0];
break;
case DbType.Int16:
case DbType.Int32:
case DbType.Int64:
case DbType.VarNumeric:
case DbType.Decimal:
case DbType.Double:
case DbType.Single:
case DbType.UInt16:
case DbType.UInt32:
case DbType.UInt64:
2025-10-23 08:35:35 +00:00
var numericValues = values.Select(a =>
{
if (a == null)
return (double?)null;
var s = a.ToString();
if (string.IsNullOrWhiteSpace(s))
return (double?)null;
return double.TryParse(s, NumberStyles.Any, CultureInfo.InvariantCulture, out var n) ? n : (double?)null;
}).ToArray();
value = isArray ? numericValues : numericValues[0];
2025-05-06 06:45:49 +00:00
break;
case DbType.Boolean:
var boolValues = values.Select(a => a != null && a.ToString().ToLower() != "false" && a.ToString() != "0").ToArray();
value = isArray ? boolValues : boolValues[0];
break;
}
return value;
}
}
2025-11-11 19:49:52 +00:00