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:
|
2025-10-08 09:04:32 +00:00
|
|
|
|
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
|
|
|
|
|