145 lines
5.2 KiB
C#
145 lines
5.2 KiB
C#
using System;
|
||
using System.Data;
|
||
using System.Globalization;
|
||
using System.Linq;
|
||
using System.Text.Json;
|
||
|
||
namespace Erp.Platform.Queries;
|
||
|
||
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();
|
||
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:
|
||
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;
|
||
|
||
// 🔹 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))
|
||
{
|
||
return dto.ToUniversalTime();
|
||
}
|
||
|
||
// 🔹 3. Son çare: system culture veya ISO fallback
|
||
if (DateTimeOffset.TryParse(s, CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal, out dto))
|
||
{
|
||
return dto.ToUniversalTime();
|
||
}
|
||
|
||
// 🔹 Parse edilemezse null
|
||
return (DateTimeOffset?)null;
|
||
}).ToArray();
|
||
|
||
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:
|
||
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];
|
||
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;
|
||
}
|
||
}
|
||
|