sqlsugar/Src/Asp.Net/SqlSugar/Realization/Dm/SqlBuilder/DmExpressionContext.cs

291 lines
12 KiB
C#

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
namespace SqlSugar
{
public partial class DmExpressionContext : ExpressionContext, ILambdaExpressions
{
public SqlSugarProvider Context { get; set; }
public DmExpressionContext()
{
base.DbMehtods = new DmMethod();
}
public override string SqlParameterKeyWord
{
get
{
return ":";
}
}
public override string SqlTranslationLeft { get { return "\""; } }
public override string SqlTranslationRight { get { return "\""; } }
public override string GetTranslationTableName(string entityName, bool isMapping = true)
{
return base.GetTranslationTableName(entityName, isMapping).ToUpper(IsUppper);
}
public override string GetTranslationColumnName(string columnName)
{
return base.GetTranslationColumnName(columnName).ToUpper(IsUppper);
}
public override string GetDbColumnName(string entityName, string propertyName)
{
return base.GetDbColumnName(entityName, propertyName).ToUpper(IsUppper);
}
public bool IsUppper
{
get
{
if (this.SugarContext?.Context?.Context?.CurrentConnectionConfig?.MoreSettings==null)
{
return true;
}
else
{
return this.SugarContext?.Context?.Context?.CurrentConnectionConfig?.MoreSettings.IsAutoToUpper == true;
}
}
}
}
public partial class DmMethod : DefaultDbMethod, IDbMethods
{
public override string WeekOfYear(MethodCallExpressionModel mode)
{
var parameterNameA = mode.Args[0].MemberName;
return $"TO_NUMBER(TO_CHAR({parameterNameA}, 'WW')) ";
}
public override string ParameterKeyWord { get; set; } = ":";
public override string GetStringJoinSelector(string result, string separator)
{
return $"listagg(to_char({result}),'{separator}') within group(order by {result}) ";
}
public override string ToInt64(MethodCallExpressionModel model)
{
var parameter = model.Args[0];
return string.Format(" CAST({0} AS Number)", parameter.MemberName);
}
public override string ToTime(MethodCallExpressionModel model)
{
var parameter = model.Args[0];
return string.Format(" to_timestamp({0},'0000-01-01 hh24:mi:ss') ", parameter.MemberName);
}
public override string Substring(MethodCallExpressionModel model)
{
var parameter = model.Args[0];
var parameter2 = model.Args[1];
var parameter3 = model.Args[2];
return string.Format("SUBSTR({0},1 + {1},{2})", parameter.MemberName, parameter2.MemberName, parameter3.MemberName);
}
public override string DateValue(MethodCallExpressionModel model)
{
var parameter = model.Args[0];
var parameter2 = model.Args[1];
var type = (DateType)Enum.Parse(typeof(DateType), parameter2.MemberValue.ObjToString(), false);
switch (type)
{
case DateType.Year:
return string.Format("(CAST(TO_CHAR({0},'yyyy') AS NUMBER))", parameter.MemberName);
case DateType.Month:
return string.Format("(CAST(TO_CHAR({0},'mm') AS NUMBER))", parameter.MemberName);
case DateType.Hour:
return string.Format("(CAST(TO_CHAR({0},'hh24') AS NUMBER))", parameter.MemberName);
case DateType.Second:
return string.Format("(CAST(TO_CHAR({0},'ss') AS NUMBER))", parameter.MemberName);
case DateType.Minute:
return string.Format("(CAST(TO_CHAR({0},'mi') AS NUMBER))", parameter.MemberName);
case DateType.Millisecond:
return string.Format("(CAST(TO_CHAR({0},'ff3') AS NUMBER))", parameter.MemberName);
case DateType.Quarter:
return string.Format("(CAST(TO_CHAR({0},'q') AS NUMBER))", parameter.MemberName);
case DateType.Weekday:
return $" (TO_NUMBER(TO_CHAR({parameter.MemberName}, 'D'))-1) ";
case DateType.Day:
default:
return string.Format("(CAST(TO_CHAR({0},'dd') AS NUMBER))", parameter.MemberName);
}
}
//public override string DateAddByType(MethodCallExpressionModel model)
//{
// var parameter = model.Args[0];
// var parameter2 = model.Args[1];
// var parameter3 = model.Args[2];
// var type = (DateType)Enum.Parse(typeof(DateType), parameter3.MemberValue.ObjToString(), false);
// double time = 1;
// switch (type)
// {
// case DateType.Year:
// time = 1 * 365;
// break;
// case DateType.Month:
// time = 1 * 30;
// break;
// case DateType.Day:
// break;
// case DateType.Hour:
// time = 1 / 24.0;
// break;
// case DateType.Second:
// time = 1 / 24.0 / 60.0 / 60.0;
// break;
// case DateType.Minute:
// time = 1 / 24.0 / 60.0;
// break;
// case DateType.Millisecond:
// time = 1 / 24.0 / 60.0 / 60.0 / 1000;
// break;
// }
// return string.Format("({0}+({1}*{2})) ", parameter.MemberName, time, parameter2.MemberName);
//}
public override string DateAddDay(MethodCallExpressionModel model)
{
var parameter = model.Args[0];
var parameter2 = model.Args[1];
return string.Format("({0}+(1*{1})) ", parameter.MemberName, parameter2.MemberName);
}
public override string ToString(MethodCallExpressionModel model)
{
var parameter = model.Args[0];
return string.Format(" CAST({0} AS VARCHAR2(4000))", parameter.MemberName);
}
public override string ToDate(MethodCallExpressionModel model)
{
var parameter = model.Args[0];
return string.Format(" to_date({0},'yyyy-mm-dd hh24:mi:ss')", parameter.MemberName);
}
public override string Contains(MethodCallExpressionModel model)
{
var parameter = model.Args[0];
var parameter2 = model.Args[1];
return string.Format(" ({0} like '%'||{1}||'%') ", parameter.MemberName, parameter2.MemberName);
}
public override string StartsWith(MethodCallExpressionModel model)
{
var parameter = model.Args[0];
var parameter2 = model.Args[1];
return string.Format(" ({0} like {1}||'%') ", parameter.MemberName, parameter2.MemberName);
}
public override string EndsWith(MethodCallExpressionModel model)
{
var parameter = model.Args[0];
var parameter2 = model.Args[1];
return string.Format(" ({0} like '%'||{1}) ", parameter.MemberName, parameter2.MemberName);
}
public override string Trim(MethodCallExpressionModel model)
{
var parameter = model.Args[0];
return string.Format(" trim({0}) ", parameter.MemberName);
}
public override string DateIsSameDay(MethodCallExpressionModel model)
{
var parameter = model.Args[0];
var parameter2 = model.Args[1];
return string.Format(" ( cast({0} as date)= cast( {1} as date) ) ", parameter.MemberName, parameter2.MemberName); ;
}
public override string DateIsSameByType(MethodCallExpressionModel model)
{
throw new NotSupportedException("Oracle NotSupportedException DateIsSameDay");
}
public override string Length(MethodCallExpressionModel model)
{
var parameter = model.Args[0];
return string.Format(" LENGTH({0}) ", parameter.MemberName);
}
public override string IsNull(MethodCallExpressionModel model)
{
var parameter = model.Args[0];
var parameter1 = model.Args[1];
return string.Format("NVL({0},{1})", parameter.MemberName, parameter1.MemberName);
}
public override string MergeString(params string[] strings)
{
return string.Join("||", strings);
}
public override string GetDate()
{
return "sysdate";
}
public override string GetRandom()
{
return "dbms_random.value";
}
public override string CharIndex(MethodCallExpressionModel model)
{
return string.Format("instr ({0},{1},1,1) ", model.Args[0].MemberName, model.Args[1].MemberName);
}
public override string ToDecimal(MethodCallExpressionModel model)
{
var parameter = model.Args[0];
return string.Format(" CAST({0} AS decimal(18,4))", parameter.MemberName);
}
public override string TrimEnd(MethodCallExpressionModel mode)
{
var parameterNameA = mode.Args[0].MemberName;
var parameterNameB = mode.Args[1].MemberName;
return $" RTRIM({parameterNameA}, {parameterNameB}) ";
}
public override string TrimStart(MethodCallExpressionModel mode)
{
var parameterNameA = mode.Args[0].MemberName;
var parameterNameB = mode.Args[1].MemberName;
return $" LTRIM({parameterNameA}, {parameterNameB}) ";
}
public override string Left(MethodCallExpressionModel mode)
{
var parameterNameA = mode.Args[0].MemberName;
var parameterNameB = mode.Args[1].MemberName;
return $" SUBSTR({parameterNameA}, 1, {parameterNameB}) ";
}
public override string Right(MethodCallExpressionModel mode)
{
var parameterNameA = mode.Args[0].MemberName;
var parameterNameB = mode.Args[1].MemberName;
return $" SUBSTR({parameterNameA}, -2, {parameterNameB}) ";
}
public override string Ceil(MethodCallExpressionModel mode)
{
var parameterNameA = mode.Args[0].MemberName;
return $" CEIL({parameterNameA}) ";
}
public override string NewUid(MethodCallExpressionModel mode)
{
return " SUBSTR(LOWER(RAWTOHEX(SYS_GUID())), 1, 8) ||\r\n '-' ||\r\n SUBSTR(LOWER(RAWTOHEX(SYS_GUID())), 9, 4) ||\r\n '-' ||\r\n SUBSTR(LOWER(RAWTOHEX(SYS_GUID())), 13, 4) ||\r\n '-' ||\r\n SUBSTR(LOWER(RAWTOHEX(SYS_GUID())), 17, 4) ||\r\n '-' ||\r\n SUBSTR(LOWER(RAWTOHEX(SYS_GUID())), 21) ";
}
public override string JsonField(MethodCallExpressionModel model)
{
return $"JSON_VALUE({model.Args[0].MemberName}, '$.{model.Args[1].MemberValue.ToString().ToSqlFilter()}')";
//"JSON_VALUE(j.kingorder, '$.Id') = '1'";
}
public override string FullTextContains(MethodCallExpressionModel mode)
{
var columns = mode.Args[0].MemberName;
if (mode.Args[0].MemberValue is List<string>)
{
columns = "(" + string.Join(",", mode.Args[0].MemberValue as List<string>) + ")";
}
var searchWord = mode.Args[1].MemberName;
return $" CONTAINS({columns}, {searchWord}, 1) ";
}
}
}