mirror of
https://gitee.com/dotnetchina/SqlSugar.git
synced 2025-09-19 01:58:13 +08:00
Update exp to sql
This commit is contained in:
@@ -6,113 +6,8 @@ using System.Reflection;
|
|||||||
using System.Text;
|
using System.Text;
|
||||||
namespace SqlSugar
|
namespace SqlSugar
|
||||||
{
|
{
|
||||||
public class BaseResolve
|
public partial class BaseResolve
|
||||||
{
|
{
|
||||||
#region Property
|
|
||||||
protected Expression Expression { get; set; }
|
|
||||||
protected Expression ExactExpression { get; set; }
|
|
||||||
public ExpressionContext Context { get; set; }
|
|
||||||
public bool? IsLeft { get; set; }
|
|
||||||
public int ContentIndex { get { return this.Context.Index; } }
|
|
||||||
public int Index { get; set; }
|
|
||||||
public ExpressionParameter BaseParameter { get; set; }
|
|
||||||
|
|
||||||
private BaseResolve()
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
public BaseResolve(ExpressionParameter parameter)
|
|
||||||
{
|
|
||||||
this.Expression = parameter.CurrentExpression;
|
|
||||||
this.Context = parameter.Context;
|
|
||||||
this.BaseParameter = parameter;
|
|
||||||
}
|
|
||||||
|
|
||||||
public BaseResolve Start()
|
|
||||||
{
|
|
||||||
Context.Index++;
|
|
||||||
Expression expression = this.Expression;
|
|
||||||
ExpressionParameter parameter = new ExpressionParameter()
|
|
||||||
{
|
|
||||||
Context = this.Context,
|
|
||||||
CurrentExpression = expression,
|
|
||||||
IsLeft = this.IsLeft,
|
|
||||||
BaseExpression = this.ExactExpression,
|
|
||||||
BaseParameter = this.BaseParameter,
|
|
||||||
Index = Context.Index
|
|
||||||
};
|
|
||||||
if (expression is LambdaExpression)
|
|
||||||
{
|
|
||||||
return new LambdaExpressionResolve(parameter);
|
|
||||||
}
|
|
||||||
else if (expression is BinaryExpression && expression.NodeType == ExpressionType.Coalesce)
|
|
||||||
{
|
|
||||||
return new CoalesceResolveItems(parameter);
|
|
||||||
}
|
|
||||||
else if (expression is BinaryExpression)
|
|
||||||
{
|
|
||||||
return new BinaryExpressionResolve(parameter);
|
|
||||||
}
|
|
||||||
else if (expression is BlockExpression)
|
|
||||||
{
|
|
||||||
Check.ThrowNotSupportedException("BlockExpression");
|
|
||||||
}
|
|
||||||
else if (expression is ConditionalExpression)
|
|
||||||
{
|
|
||||||
return new ConditionalExpressionResolve(parameter);
|
|
||||||
}
|
|
||||||
else if (expression is MethodCallExpression)
|
|
||||||
{
|
|
||||||
return new MethodCallExpressionResolve(parameter);
|
|
||||||
}
|
|
||||||
else if (expression is MemberExpression && ((MemberExpression)expression).Expression == null)
|
|
||||||
{
|
|
||||||
return new MemberNoExpressionResolve(parameter);
|
|
||||||
}
|
|
||||||
else if (expression is MemberExpression && ((MemberExpression)expression).Expression.NodeType == ExpressionType.Constant)
|
|
||||||
{
|
|
||||||
return new MemberConstExpressionResolve(parameter);
|
|
||||||
}
|
|
||||||
else if (expression is MemberExpression && ((MemberExpression)expression).Expression.NodeType == ExpressionType.New)
|
|
||||||
{
|
|
||||||
return new MemberNewExpressionResolve(parameter);
|
|
||||||
}
|
|
||||||
else if (expression is ConstantExpression)
|
|
||||||
{
|
|
||||||
return new ConstantExpressionResolve(parameter);
|
|
||||||
}
|
|
||||||
else if (expression is MemberExpression)
|
|
||||||
{
|
|
||||||
return new MemberExpressionResolve(parameter);
|
|
||||||
}
|
|
||||||
else if (expression is UnaryExpression)
|
|
||||||
{
|
|
||||||
return new UnaryExpressionResolve(parameter);
|
|
||||||
}
|
|
||||||
else if (expression is MemberInitExpression)
|
|
||||||
{
|
|
||||||
return new MemberInitExpressionResolve(parameter);
|
|
||||||
}
|
|
||||||
else if (expression is NewExpression)
|
|
||||||
{
|
|
||||||
return new NewExpressionResolve(parameter);
|
|
||||||
}
|
|
||||||
else if (expression is NewArrayExpression)
|
|
||||||
{
|
|
||||||
return new NewArrayExpessionResolve(parameter);
|
|
||||||
}
|
|
||||||
else if (expression is ParameterExpression)
|
|
||||||
{
|
|
||||||
return new TypeParameterExpressionReolve(parameter);
|
|
||||||
}
|
|
||||||
else if (expression != null && expression.NodeType.IsIn(ExpressionType.NewArrayBounds))
|
|
||||||
{
|
|
||||||
Check.ThrowNotSupportedException("ExpressionType.NewArrayBounds");
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region Append
|
#region Append
|
||||||
protected void AppendMember(ExpressionParameter parameter, bool? isLeft, object appendValue)
|
protected void AppendMember(ExpressionParameter parameter, bool? isLeft, object appendValue)
|
||||||
@@ -603,350 +498,5 @@ namespace SqlSugar
|
|||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region Helper
|
|
||||||
|
|
||||||
protected void SetNavigateResult()
|
|
||||||
{
|
|
||||||
if (this.Context != null)
|
|
||||||
{
|
|
||||||
if (this.Context.Result != null)
|
|
||||||
{
|
|
||||||
this.Context.Result.IsNavicate = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
private string GetAsName(Expression item, object shortName, PropertyInfo property)
|
|
||||||
{
|
|
||||||
string asName;
|
|
||||||
var propertyName = property.Name;
|
|
||||||
var dbColumnName = propertyName;
|
|
||||||
var mappingInfo = this.Context.MappingColumns.FirstOrDefault(it => it.EntityName == item.Type.Name && it.PropertyName.Equals(propertyName, StringComparison.CurrentCultureIgnoreCase));
|
|
||||||
if (mappingInfo.HasValue())
|
|
||||||
{
|
|
||||||
dbColumnName = mappingInfo.DbColumnName;
|
|
||||||
}
|
|
||||||
asName = this.Context.GetTranslationText(item.Type.Name + "." + propertyName);
|
|
||||||
if (Context.IsJoin)
|
|
||||||
{
|
|
||||||
this.Context.Result.Append(Context.GetAsString(asName, dbColumnName, shortName.ObjToString()));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
this.Context.Result.Append(Context.GetAsString(asName, dbColumnName));
|
|
||||||
}
|
|
||||||
|
|
||||||
return asName;
|
|
||||||
}
|
|
||||||
private string GetAsNameAndShortName(Expression item, object shortName, PropertyInfo property)
|
|
||||||
{
|
|
||||||
string asName;
|
|
||||||
var propertyName = property.Name;
|
|
||||||
var dbColumnName = propertyName;
|
|
||||||
var mappingInfo = this.Context.MappingColumns.FirstOrDefault(it => it.EntityName == item.Type.Name && it.PropertyName.Equals(propertyName, StringComparison.CurrentCultureIgnoreCase));
|
|
||||||
if (mappingInfo.HasValue())
|
|
||||||
{
|
|
||||||
dbColumnName = mappingInfo.DbColumnName;
|
|
||||||
}
|
|
||||||
if (shortName != null && shortName.ObjToString().Contains(this.Context.SqlTranslationLeft) && this.Context.IsSingle)
|
|
||||||
{
|
|
||||||
asName = this.Context.GetTranslationText(item.Type.Name + "." + propertyName);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
asName = this.Context.GetTranslationText(shortName + "." + item.Type.Name + "." + propertyName);
|
|
||||||
}
|
|
||||||
if (Context.IsJoin)
|
|
||||||
{
|
|
||||||
this.Context.Result.Append(Context.GetAsString(asName, dbColumnName, shortName.ObjToString()));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
this.Context.Result.Append(Context.GetAsString(asName, dbColumnName));
|
|
||||||
}
|
|
||||||
|
|
||||||
return asName;
|
|
||||||
}
|
|
||||||
private EntityColumnInfo GetColumnInfo(Expression oppoSiteExpression)
|
|
||||||
{
|
|
||||||
var oppsite = (oppoSiteExpression as MemberExpression);
|
|
||||||
if (oppsite == null) return null;
|
|
||||||
if (this.Context.SugarContext == null) return null;
|
|
||||||
if (this.Context.SugarContext.Context == null) return null;
|
|
||||||
if (oppsite.Expression == null) return null;
|
|
||||||
var columnInfo = this.Context.SugarContext.Context.EntityMaintenance
|
|
||||||
.GetEntityInfo(oppsite.Expression.Type).Columns.FirstOrDefault(it => it.PropertyName == oppsite.Member.Name);
|
|
||||||
return columnInfo;
|
|
||||||
}
|
|
||||||
protected MethodCallExpressionArgs GetMethodCallArgs(ExpressionParameter parameter, Expression item,string name=null)
|
|
||||||
{
|
|
||||||
var newContext = this.Context.GetCopyContext();
|
|
||||||
newContext.MappingColumns = this.Context.MappingColumns;
|
|
||||||
newContext.MappingTables = this.Context.MappingTables;
|
|
||||||
newContext.IgnoreComumnList = this.Context.IgnoreComumnList;
|
|
||||||
newContext.IsSingle = this.Context.IsSingle;
|
|
||||||
newContext.SqlFuncServices = this.Context.SqlFuncServices;
|
|
||||||
newContext.MethodName = name;
|
|
||||||
newContext.Resolve(item, this.Context.IsJoin ? ResolveExpressType.WhereMultiple : ResolveExpressType.WhereSingle);
|
|
||||||
this.Context.Index = newContext.Index;
|
|
||||||
this.Context.ParameterIndex = newContext.ParameterIndex;
|
|
||||||
if (newContext.Parameters.HasValue())
|
|
||||||
{
|
|
||||||
this.Context.Parameters.AddRange(newContext.Parameters);
|
|
||||||
}
|
|
||||||
if (newContext.SingleTableNameSubqueryShortName.HasValue())
|
|
||||||
{
|
|
||||||
this.Context.SingleTableNameSubqueryShortName = newContext.SingleTableNameSubqueryShortName;
|
|
||||||
}
|
|
||||||
var methodCallExpressionArgs = new MethodCallExpressionArgs()
|
|
||||||
{
|
|
||||||
IsMember = true,
|
|
||||||
MemberName = newContext.Result.GetResultString()
|
|
||||||
};
|
|
||||||
return methodCallExpressionArgs;
|
|
||||||
}
|
|
||||||
private string GetAsNameResolveAnObject(ExpressionParameter parameter, Expression item, string asName, bool isSameType)
|
|
||||||
{
|
|
||||||
this.Start();
|
|
||||||
var shortName = parameter.CommonTempData;
|
|
||||||
var listProperties = item.Type.GetProperties().Cast<PropertyInfo>().ToList();
|
|
||||||
foreach (var property in listProperties)
|
|
||||||
{
|
|
||||||
var hasIgnore = this.Context.IgnoreComumnList != null && this.Context.IgnoreComumnList.Any(it => it.EntityName.Equals(item.Type.Name, StringComparison.CurrentCultureIgnoreCase) && it.PropertyName.Equals(property.Name, StringComparison.CurrentCultureIgnoreCase));
|
|
||||||
if (hasIgnore)
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (property.PropertyType.IsClass())
|
|
||||||
{
|
|
||||||
var comumnInfo = property.GetCustomAttribute<SugarColumn>();
|
|
||||||
if (comumnInfo != null && comumnInfo.IsJson && isSameType)
|
|
||||||
{
|
|
||||||
asName = GetAsNameAndShortName(item, shortName, property);
|
|
||||||
}
|
|
||||||
else if (comumnInfo != null && comumnInfo.IsJson)
|
|
||||||
{
|
|
||||||
asName = GetAsName(item, shortName, property);
|
|
||||||
}
|
|
||||||
else if (comumnInfo != null && this.Context.SugarContext != null && this.Context.SugarContext.Context != null)
|
|
||||||
{
|
|
||||||
var entityInfo = this.Context.SugarContext.Context.EntityMaintenance.GetEntityInfo(item.Type);
|
|
||||||
var entityColumn = entityInfo.Columns.FirstOrDefault(it => it.PropertyName == property.Name);
|
|
||||||
if (entityColumn != null && entityColumn.IsJson)
|
|
||||||
{
|
|
||||||
asName = GetAsName(item, shortName, property);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (isSameType)
|
|
||||||
{
|
|
||||||
asName = GetAsNameAndShortName(item, shortName, property);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
asName = GetAsName(item, shortName, property);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return asName;
|
|
||||||
}
|
|
||||||
public object GetAsNamePackIfElse(object methodValue)
|
|
||||||
{
|
|
||||||
methodValue = this.Context.DbMehtods.CaseWhen(new List<KeyValuePair<string, string>>() {
|
|
||||||
new KeyValuePair<string, string>("IF",methodValue.ObjToString()),
|
|
||||||
new KeyValuePair<string, string>("Return","1"),
|
|
||||||
new KeyValuePair<string, string>("End","0")
|
|
||||||
});
|
|
||||||
return methodValue;
|
|
||||||
}
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region Validate
|
|
||||||
|
|
||||||
private bool IsExtSqlFuncObj(Expression item)
|
|
||||||
{
|
|
||||||
return this.Context.SqlFuncServices != null && item is MethodCallExpression && this.Context.SqlFuncServices.Any(it => it.UniqueMethodName == ExpressionTool.GetMethodName(item));
|
|
||||||
}
|
|
||||||
private bool IsNullValue(ExpressionParameter parameter, object value)
|
|
||||||
{
|
|
||||||
return value == null
|
|
||||||
&& !parameter.ValueIsNull
|
|
||||||
&& parameter.BaseParameter != null
|
|
||||||
&& parameter.BaseParameter.OperatorValue.IsIn("=","<>")
|
|
||||||
&& this.Context.ResolveType.IsIn(ResolveExpressType.WhereMultiple, ResolveExpressType.WhereSingle);
|
|
||||||
}
|
|
||||||
private static bool IsNotCaseExpression(Expression item)
|
|
||||||
{
|
|
||||||
if ((item as MethodCallExpression).Method.Name == "IIF")
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
else if ((item as MethodCallExpression).Method.Name == "IsNull")
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
else if ((item as MethodCallExpression).Method.Name == "End" && item.ToString().Contains("IF("))
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
else if ((item as MethodCallExpression).Method.Name == "AggregateMax")
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
else if ((item as MethodCallExpression).Method.Name == "AggregateMin")
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
else if ((item as MethodCallExpression).Method.Name == "AggregateSum")
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
else if ((item as MethodCallExpression).Method.Name == "ToBool")
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
else if ((item as MethodCallExpression).Method.Name == "ToBoolean")
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
else if ((item as MethodCallExpression).Method.Name == "Select" && item.ToString().Contains("Subqueryable()"))
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
private static bool IsBoolValue(Expression item)
|
|
||||||
{
|
|
||||||
return item.Type == UtilConstants.BoolType &&
|
|
||||||
(item is MemberExpression) &&
|
|
||||||
(item as MemberExpression).Expression != null &&
|
|
||||||
(item as MemberExpression).Expression.Type == typeof(bool?) &&
|
|
||||||
(item as MemberExpression).Member.Name == "Value";
|
|
||||||
}
|
|
||||||
protected static bool IsConvert(Expression item)
|
|
||||||
{
|
|
||||||
return item is UnaryExpression && item.NodeType == ExpressionType.Convert;
|
|
||||||
}
|
|
||||||
protected static bool IsNotMember(Expression item)
|
|
||||||
{
|
|
||||||
return item is UnaryExpression &&
|
|
||||||
item.Type == UtilConstants.BoolType &&
|
|
||||||
(item as UnaryExpression).NodeType == ExpressionType.Not &&
|
|
||||||
(item as UnaryExpression).Operand is MemberExpression &&
|
|
||||||
((item as UnaryExpression).Operand as MemberExpression).Expression != null &&
|
|
||||||
((item as UnaryExpression).Operand as MemberExpression).Expression.NodeType == ExpressionType.Parameter;
|
|
||||||
}
|
|
||||||
protected static bool IsNotParameter(Expression item)
|
|
||||||
{
|
|
||||||
return item is UnaryExpression &&
|
|
||||||
item.Type == UtilConstants.BoolType &&
|
|
||||||
(item as UnaryExpression).NodeType == ExpressionType.Not &&
|
|
||||||
(item as UnaryExpression).Operand is MemberExpression &&
|
|
||||||
((item as UnaryExpression).Operand as MemberExpression).Expression != null &&
|
|
||||||
((item as UnaryExpression).Operand as MemberExpression).Expression.NodeType == ExpressionType.MemberAccess;
|
|
||||||
}
|
|
||||||
protected bool IsSubMethod(MethodCallExpression express)
|
|
||||||
{
|
|
||||||
return SubTools.SubItemsConst.Any(it => express.Object != null && express.Object.Type.Name.StartsWith("Subqueryable`"));
|
|
||||||
}
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region Dictionary
|
|
||||||
private Dictionary<string, string> GetMappingColumns(Expression currentExpression)
|
|
||||||
{
|
|
||||||
Dictionary<string, string> result = new Dictionary<string, string>();
|
|
||||||
if (currentExpression == null)
|
|
||||||
{
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
List<Type> types = new List<Type>();
|
|
||||||
int i = 0;
|
|
||||||
if (currentExpression is NewExpression)
|
|
||||||
{
|
|
||||||
i = (currentExpression as NewExpression).Arguments.Count;
|
|
||||||
foreach (var item in (currentExpression as NewExpression).Arguments)
|
|
||||||
{
|
|
||||||
if (item.Type.IsClass())
|
|
||||||
{
|
|
||||||
types.Add(item.Type);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (currentExpression is MemberInitExpression)
|
|
||||||
{
|
|
||||||
i = (currentExpression as MemberInitExpression).Bindings.Count;
|
|
||||||
foreach (var item in (currentExpression as MemberInitExpression).Bindings)
|
|
||||||
{
|
|
||||||
MemberAssignment memberAssignment = (MemberAssignment)item;
|
|
||||||
if (memberAssignment.Expression.Type.IsClass())
|
|
||||||
{
|
|
||||||
types.Add(memberAssignment.Expression.Type);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (types.Count == i && (types.Count == types.Distinct().Count()))
|
|
||||||
{
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
var array = currentExpression.ToString().Split(',');
|
|
||||||
foreach (var item in array)
|
|
||||||
{
|
|
||||||
var itemArray = item.Split('=').ToArray();
|
|
||||||
var last = itemArray.Last().Trim().Split('.').First().TrimEnd(')').TrimEnd('}');
|
|
||||||
var first = itemArray.First().Trim();
|
|
||||||
if (first.Contains("{"))
|
|
||||||
{
|
|
||||||
first = first.Split('{').Last().Trim();
|
|
||||||
}
|
|
||||||
if (first.Contains("("))
|
|
||||||
{
|
|
||||||
first = first.Split('(').Last().Trim();
|
|
||||||
}
|
|
||||||
if (!result.ContainsKey(first))
|
|
||||||
{
|
|
||||||
result.Add(first, last);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
//future
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return result; ;
|
|
||||||
}
|
|
||||||
protected static Dictionary<string, string> MethodMapping = new Dictionary<string, string>() {
|
|
||||||
{ "ToString","ToString"},
|
|
||||||
{ "ToInt32","ToInt32"},
|
|
||||||
{ "ToInt16","ToInt32"},
|
|
||||||
{ "ToInt64","ToInt64"},
|
|
||||||
{ "ToDecimal","ToDecimal"},
|
|
||||||
{ "ToDateTime","ToDate"},
|
|
||||||
{ "ToBoolean","ToBool"},
|
|
||||||
{ "ToDouble","ToDouble"},
|
|
||||||
{ "Length","Length"},
|
|
||||||
{ "Replace","Replace"},
|
|
||||||
{ "Contains","Contains"},
|
|
||||||
{ "ContainsArray","ContainsArray"},
|
|
||||||
{ "EndsWith","EndsWith"},
|
|
||||||
{ "StartsWith","StartsWith"},
|
|
||||||
{ "HasValue","HasValue"},
|
|
||||||
{ "Trim","Trim"},
|
|
||||||
{ "Equals","Equals"},
|
|
||||||
{ "ToLower","ToLower"},
|
|
||||||
{ "ToUpper","ToUpper"},
|
|
||||||
{ "Substring","Substring"},
|
|
||||||
{ "DateAdd","DateAdd"}
|
|
||||||
};
|
|
||||||
protected static Dictionary<string, DateType> MethodTimeMapping = new Dictionary<string, DateType>() {
|
|
||||||
{ "AddYears",DateType.Year},
|
|
||||||
{ "AddMonths",DateType.Month},
|
|
||||||
{ "AddDays",DateType.Day},
|
|
||||||
{ "AddHours",DateType.Hour},
|
|
||||||
{ "AddMinutes",DateType.Minute},
|
|
||||||
{ "AddSeconds",DateType.Second},
|
|
||||||
{ "AddMilliseconds",DateType.Millisecond}
|
|
||||||
};
|
|
||||||
#endregion
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -0,0 +1,168 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Linq.Expressions;
|
||||||
|
using System.Reflection;
|
||||||
|
using System.Text;
|
||||||
|
namespace SqlSugar
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// BaseResolve-Helper
|
||||||
|
/// </summary>
|
||||||
|
public partial class BaseResolve
|
||||||
|
{
|
||||||
|
protected void SetNavigateResult()
|
||||||
|
{
|
||||||
|
if (this.Context != null)
|
||||||
|
{
|
||||||
|
if (this.Context.Result != null)
|
||||||
|
{
|
||||||
|
this.Context.Result.IsNavicate = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
private string GetAsName(Expression item, object shortName, PropertyInfo property)
|
||||||
|
{
|
||||||
|
string asName;
|
||||||
|
var propertyName = property.Name;
|
||||||
|
var dbColumnName = propertyName;
|
||||||
|
var mappingInfo = this.Context.MappingColumns.FirstOrDefault(it => it.EntityName == item.Type.Name && it.PropertyName.Equals(propertyName, StringComparison.CurrentCultureIgnoreCase));
|
||||||
|
if (mappingInfo.HasValue())
|
||||||
|
{
|
||||||
|
dbColumnName = mappingInfo.DbColumnName;
|
||||||
|
}
|
||||||
|
asName = this.Context.GetTranslationText(item.Type.Name + "." + propertyName);
|
||||||
|
if (Context.IsJoin)
|
||||||
|
{
|
||||||
|
this.Context.Result.Append(Context.GetAsString(asName, dbColumnName, shortName.ObjToString()));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
this.Context.Result.Append(Context.GetAsString(asName, dbColumnName));
|
||||||
|
}
|
||||||
|
|
||||||
|
return asName;
|
||||||
|
}
|
||||||
|
private string GetAsNameAndShortName(Expression item, object shortName, PropertyInfo property)
|
||||||
|
{
|
||||||
|
string asName;
|
||||||
|
var propertyName = property.Name;
|
||||||
|
var dbColumnName = propertyName;
|
||||||
|
var mappingInfo = this.Context.MappingColumns.FirstOrDefault(it => it.EntityName == item.Type.Name && it.PropertyName.Equals(propertyName, StringComparison.CurrentCultureIgnoreCase));
|
||||||
|
if (mappingInfo.HasValue())
|
||||||
|
{
|
||||||
|
dbColumnName = mappingInfo.DbColumnName;
|
||||||
|
}
|
||||||
|
if (shortName != null && shortName.ObjToString().Contains(this.Context.SqlTranslationLeft) && this.Context.IsSingle)
|
||||||
|
{
|
||||||
|
asName = this.Context.GetTranslationText(item.Type.Name + "." + propertyName);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
asName = this.Context.GetTranslationText(shortName + "." + item.Type.Name + "." + propertyName);
|
||||||
|
}
|
||||||
|
if (Context.IsJoin)
|
||||||
|
{
|
||||||
|
this.Context.Result.Append(Context.GetAsString(asName, dbColumnName, shortName.ObjToString()));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
this.Context.Result.Append(Context.GetAsString(asName, dbColumnName));
|
||||||
|
}
|
||||||
|
|
||||||
|
return asName;
|
||||||
|
}
|
||||||
|
private EntityColumnInfo GetColumnInfo(Expression oppoSiteExpression)
|
||||||
|
{
|
||||||
|
var oppsite = (oppoSiteExpression as MemberExpression);
|
||||||
|
if (oppsite == null) return null;
|
||||||
|
if (this.Context.SugarContext == null) return null;
|
||||||
|
if (this.Context.SugarContext.Context == null) return null;
|
||||||
|
if (oppsite.Expression == null) return null;
|
||||||
|
var columnInfo = this.Context.SugarContext.Context.EntityMaintenance
|
||||||
|
.GetEntityInfo(oppsite.Expression.Type).Columns.FirstOrDefault(it => it.PropertyName == oppsite.Member.Name);
|
||||||
|
return columnInfo;
|
||||||
|
}
|
||||||
|
protected MethodCallExpressionArgs GetMethodCallArgs(ExpressionParameter parameter, Expression item, string name = null)
|
||||||
|
{
|
||||||
|
var newContext = this.Context.GetCopyContext();
|
||||||
|
newContext.MappingColumns = this.Context.MappingColumns;
|
||||||
|
newContext.MappingTables = this.Context.MappingTables;
|
||||||
|
newContext.IgnoreComumnList = this.Context.IgnoreComumnList;
|
||||||
|
newContext.IsSingle = this.Context.IsSingle;
|
||||||
|
newContext.SqlFuncServices = this.Context.SqlFuncServices;
|
||||||
|
newContext.MethodName = name;
|
||||||
|
newContext.Resolve(item, this.Context.IsJoin ? ResolveExpressType.WhereMultiple : ResolveExpressType.WhereSingle);
|
||||||
|
this.Context.Index = newContext.Index;
|
||||||
|
this.Context.ParameterIndex = newContext.ParameterIndex;
|
||||||
|
if (newContext.Parameters.HasValue())
|
||||||
|
{
|
||||||
|
this.Context.Parameters.AddRange(newContext.Parameters);
|
||||||
|
}
|
||||||
|
if (newContext.SingleTableNameSubqueryShortName.HasValue())
|
||||||
|
{
|
||||||
|
this.Context.SingleTableNameSubqueryShortName = newContext.SingleTableNameSubqueryShortName;
|
||||||
|
}
|
||||||
|
var methodCallExpressionArgs = new MethodCallExpressionArgs()
|
||||||
|
{
|
||||||
|
IsMember = true,
|
||||||
|
MemberName = newContext.Result.GetResultString()
|
||||||
|
};
|
||||||
|
return methodCallExpressionArgs;
|
||||||
|
}
|
||||||
|
private string GetAsNameResolveAnObject(ExpressionParameter parameter, Expression item, string asName, bool isSameType)
|
||||||
|
{
|
||||||
|
this.Start();
|
||||||
|
var shortName = parameter.CommonTempData;
|
||||||
|
var listProperties = item.Type.GetProperties().Cast<PropertyInfo>().ToList();
|
||||||
|
foreach (var property in listProperties)
|
||||||
|
{
|
||||||
|
var hasIgnore = this.Context.IgnoreComumnList != null && this.Context.IgnoreComumnList.Any(it => it.EntityName.Equals(item.Type.Name, StringComparison.CurrentCultureIgnoreCase) && it.PropertyName.Equals(property.Name, StringComparison.CurrentCultureIgnoreCase));
|
||||||
|
if (hasIgnore)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (property.PropertyType.IsClass())
|
||||||
|
{
|
||||||
|
var comumnInfo = property.GetCustomAttribute<SugarColumn>();
|
||||||
|
if (comumnInfo != null && comumnInfo.IsJson && isSameType)
|
||||||
|
{
|
||||||
|
asName = GetAsNameAndShortName(item, shortName, property);
|
||||||
|
}
|
||||||
|
else if (comumnInfo != null && comumnInfo.IsJson)
|
||||||
|
{
|
||||||
|
asName = GetAsName(item, shortName, property);
|
||||||
|
}
|
||||||
|
else if (comumnInfo != null && this.Context.SugarContext != null && this.Context.SugarContext.Context != null)
|
||||||
|
{
|
||||||
|
var entityInfo = this.Context.SugarContext.Context.EntityMaintenance.GetEntityInfo(item.Type);
|
||||||
|
var entityColumn = entityInfo.Columns.FirstOrDefault(it => it.PropertyName == property.Name);
|
||||||
|
if (entityColumn != null && entityColumn.IsJson)
|
||||||
|
{
|
||||||
|
asName = GetAsName(item, shortName, property);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (isSameType)
|
||||||
|
{
|
||||||
|
asName = GetAsNameAndShortName(item, shortName, property);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
asName = GetAsName(item, shortName, property);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return asName;
|
||||||
|
}
|
||||||
|
public object GetAsNamePackIfElse(object methodValue)
|
||||||
|
{
|
||||||
|
methodValue = this.Context.DbMehtods.CaseWhen(new List<KeyValuePair<string, string>>() {
|
||||||
|
new KeyValuePair<string, string>("IF",methodValue.ObjToString()),
|
||||||
|
new KeyValuePair<string, string>("Return","1"),
|
||||||
|
new KeyValuePair<string, string>("End","0")
|
||||||
|
});
|
||||||
|
return methodValue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -0,0 +1,213 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Linq.Expressions;
|
||||||
|
using System.Reflection;
|
||||||
|
using System.Text;
|
||||||
|
namespace SqlSugar
|
||||||
|
{
|
||||||
|
public partial class BaseResolve
|
||||||
|
{
|
||||||
|
#region Property
|
||||||
|
protected Expression Expression { get; set; }
|
||||||
|
protected Expression ExactExpression { get; set; }
|
||||||
|
public ExpressionContext Context { get; set; }
|
||||||
|
public bool? IsLeft { get; set; }
|
||||||
|
public int ContentIndex { get { return this.Context.Index; } }
|
||||||
|
public int Index { get; set; }
|
||||||
|
public ExpressionParameter BaseParameter { get; set; }
|
||||||
|
|
||||||
|
private BaseResolve()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
public BaseResolve(ExpressionParameter parameter)
|
||||||
|
{
|
||||||
|
this.Expression = parameter.CurrentExpression;
|
||||||
|
this.Context = parameter.Context;
|
||||||
|
this.BaseParameter = parameter;
|
||||||
|
}
|
||||||
|
|
||||||
|
public BaseResolve Start()
|
||||||
|
{
|
||||||
|
Context.Index++;
|
||||||
|
Expression expression = this.Expression;
|
||||||
|
ExpressionParameter parameter = new ExpressionParameter()
|
||||||
|
{
|
||||||
|
Context = this.Context,
|
||||||
|
CurrentExpression = expression,
|
||||||
|
IsLeft = this.IsLeft,
|
||||||
|
BaseExpression = this.ExactExpression,
|
||||||
|
BaseParameter = this.BaseParameter,
|
||||||
|
Index = Context.Index
|
||||||
|
};
|
||||||
|
if (expression is LambdaExpression)
|
||||||
|
{
|
||||||
|
return new LambdaExpressionResolve(parameter);
|
||||||
|
}
|
||||||
|
else if (expression is BinaryExpression && expression.NodeType == ExpressionType.Coalesce)
|
||||||
|
{
|
||||||
|
return new CoalesceResolveItems(parameter);
|
||||||
|
}
|
||||||
|
else if (expression is BinaryExpression)
|
||||||
|
{
|
||||||
|
return new BinaryExpressionResolve(parameter);
|
||||||
|
}
|
||||||
|
else if (expression is BlockExpression)
|
||||||
|
{
|
||||||
|
Check.ThrowNotSupportedException("BlockExpression");
|
||||||
|
}
|
||||||
|
else if (expression is ConditionalExpression)
|
||||||
|
{
|
||||||
|
return new ConditionalExpressionResolve(parameter);
|
||||||
|
}
|
||||||
|
else if (expression is MethodCallExpression)
|
||||||
|
{
|
||||||
|
return new MethodCallExpressionResolve(parameter);
|
||||||
|
}
|
||||||
|
else if (expression is MemberExpression && ((MemberExpression)expression).Expression == null)
|
||||||
|
{
|
||||||
|
return new MemberNoExpressionResolve(parameter);
|
||||||
|
}
|
||||||
|
else if (expression is MemberExpression && ((MemberExpression)expression).Expression.NodeType == ExpressionType.Constant)
|
||||||
|
{
|
||||||
|
return new MemberConstExpressionResolve(parameter);
|
||||||
|
}
|
||||||
|
else if (expression is MemberExpression && ((MemberExpression)expression).Expression.NodeType == ExpressionType.New)
|
||||||
|
{
|
||||||
|
return new MemberNewExpressionResolve(parameter);
|
||||||
|
}
|
||||||
|
else if (expression is ConstantExpression)
|
||||||
|
{
|
||||||
|
return new ConstantExpressionResolve(parameter);
|
||||||
|
}
|
||||||
|
else if (expression is MemberExpression)
|
||||||
|
{
|
||||||
|
return new MemberExpressionResolve(parameter);
|
||||||
|
}
|
||||||
|
else if (expression is UnaryExpression)
|
||||||
|
{
|
||||||
|
return new UnaryExpressionResolve(parameter);
|
||||||
|
}
|
||||||
|
else if (expression is MemberInitExpression)
|
||||||
|
{
|
||||||
|
return new MemberInitExpressionResolve(parameter);
|
||||||
|
}
|
||||||
|
else if (expression is NewExpression)
|
||||||
|
{
|
||||||
|
return new NewExpressionResolve(parameter);
|
||||||
|
}
|
||||||
|
else if (expression is NewArrayExpression)
|
||||||
|
{
|
||||||
|
return new NewArrayExpessionResolve(parameter);
|
||||||
|
}
|
||||||
|
else if (expression is ParameterExpression)
|
||||||
|
{
|
||||||
|
return new TypeParameterExpressionReolve(parameter);
|
||||||
|
}
|
||||||
|
else if (expression != null && expression.NodeType.IsIn(ExpressionType.NewArrayBounds))
|
||||||
|
{
|
||||||
|
Check.ThrowNotSupportedException("ExpressionType.NewArrayBounds");
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Dictionary
|
||||||
|
private Dictionary<string, string> GetMappingColumns(Expression currentExpression)
|
||||||
|
{
|
||||||
|
Dictionary<string, string> result = new Dictionary<string, string>();
|
||||||
|
if (currentExpression == null)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
List<Type> types = new List<Type>();
|
||||||
|
int i = 0;
|
||||||
|
if (currentExpression is NewExpression)
|
||||||
|
{
|
||||||
|
i = (currentExpression as NewExpression).Arguments.Count;
|
||||||
|
foreach (var item in (currentExpression as NewExpression).Arguments)
|
||||||
|
{
|
||||||
|
if (item.Type.IsClass())
|
||||||
|
{
|
||||||
|
types.Add(item.Type);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (currentExpression is MemberInitExpression)
|
||||||
|
{
|
||||||
|
i = (currentExpression as MemberInitExpression).Bindings.Count;
|
||||||
|
foreach (var item in (currentExpression as MemberInitExpression).Bindings)
|
||||||
|
{
|
||||||
|
MemberAssignment memberAssignment = (MemberAssignment)item;
|
||||||
|
if (memberAssignment.Expression.Type.IsClass())
|
||||||
|
{
|
||||||
|
types.Add(memberAssignment.Expression.Type);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (types.Count == i && (types.Count == types.Distinct().Count()))
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
var array = currentExpression.ToString().Split(',');
|
||||||
|
foreach (var item in array)
|
||||||
|
{
|
||||||
|
var itemArray = item.Split('=').ToArray();
|
||||||
|
var last = itemArray.Last().Trim().Split('.').First().TrimEnd(')').TrimEnd('}');
|
||||||
|
var first = itemArray.First().Trim();
|
||||||
|
if (first.Contains("{"))
|
||||||
|
{
|
||||||
|
first = first.Split('{').Last().Trim();
|
||||||
|
}
|
||||||
|
if (first.Contains("("))
|
||||||
|
{
|
||||||
|
first = first.Split('(').Last().Trim();
|
||||||
|
}
|
||||||
|
if (!result.ContainsKey(first))
|
||||||
|
{
|
||||||
|
result.Add(first, last);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//future
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result; ;
|
||||||
|
}
|
||||||
|
protected static Dictionary<string, string> MethodMapping = new Dictionary<string, string>() {
|
||||||
|
{ "ToString","ToString"},
|
||||||
|
{ "ToInt32","ToInt32"},
|
||||||
|
{ "ToInt16","ToInt32"},
|
||||||
|
{ "ToInt64","ToInt64"},
|
||||||
|
{ "ToDecimal","ToDecimal"},
|
||||||
|
{ "ToDateTime","ToDate"},
|
||||||
|
{ "ToBoolean","ToBool"},
|
||||||
|
{ "ToDouble","ToDouble"},
|
||||||
|
{ "Length","Length"},
|
||||||
|
{ "Replace","Replace"},
|
||||||
|
{ "Contains","Contains"},
|
||||||
|
{ "ContainsArray","ContainsArray"},
|
||||||
|
{ "EndsWith","EndsWith"},
|
||||||
|
{ "StartsWith","StartsWith"},
|
||||||
|
{ "HasValue","HasValue"},
|
||||||
|
{ "Trim","Trim"},
|
||||||
|
{ "Equals","Equals"},
|
||||||
|
{ "ToLower","ToLower"},
|
||||||
|
{ "ToUpper","ToUpper"},
|
||||||
|
{ "Substring","Substring"},
|
||||||
|
{ "DateAdd","DateAdd"}
|
||||||
|
};
|
||||||
|
protected static Dictionary<string, DateType> MethodTimeMapping = new Dictionary<string, DateType>() {
|
||||||
|
{ "AddYears",DateType.Year},
|
||||||
|
{ "AddMonths",DateType.Month},
|
||||||
|
{ "AddDays",DateType.Day},
|
||||||
|
{ "AddHours",DateType.Hour},
|
||||||
|
{ "AddMinutes",DateType.Minute},
|
||||||
|
{ "AddSeconds",DateType.Second},
|
||||||
|
{ "AddMilliseconds",DateType.Millisecond}
|
||||||
|
};
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
|
}
|
@@ -0,0 +1,105 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Linq.Expressions;
|
||||||
|
using System.Reflection;
|
||||||
|
using System.Text;
|
||||||
|
namespace SqlSugar
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// BaseResolve-Validate
|
||||||
|
/// </summary>
|
||||||
|
public partial class BaseResolve
|
||||||
|
{
|
||||||
|
|
||||||
|
private bool IsExtSqlFuncObj(Expression item)
|
||||||
|
{
|
||||||
|
return this.Context.SqlFuncServices != null && item is MethodCallExpression && this.Context.SqlFuncServices.Any(it => it.UniqueMethodName == ExpressionTool.GetMethodName(item));
|
||||||
|
}
|
||||||
|
private bool IsNullValue(ExpressionParameter parameter, object value)
|
||||||
|
{
|
||||||
|
return value == null
|
||||||
|
&& !parameter.ValueIsNull
|
||||||
|
&& parameter.BaseParameter != null
|
||||||
|
&& parameter.BaseParameter.OperatorValue.IsIn("=", "<>")
|
||||||
|
&& this.Context.ResolveType.IsIn(ResolveExpressType.WhereMultiple, ResolveExpressType.WhereSingle);
|
||||||
|
}
|
||||||
|
private static bool IsNotCaseExpression(Expression item)
|
||||||
|
{
|
||||||
|
if ((item as MethodCallExpression).Method.Name == "IIF")
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else if ((item as MethodCallExpression).Method.Name == "IsNull")
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else if ((item as MethodCallExpression).Method.Name == "End" && item.ToString().Contains("IF("))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else if ((item as MethodCallExpression).Method.Name == "AggregateMax")
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else if ((item as MethodCallExpression).Method.Name == "AggregateMin")
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else if ((item as MethodCallExpression).Method.Name == "AggregateSum")
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else if ((item as MethodCallExpression).Method.Name == "ToBool")
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else if ((item as MethodCallExpression).Method.Name == "ToBoolean")
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else if ((item as MethodCallExpression).Method.Name == "Select" && item.ToString().Contains("Subqueryable()"))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
private static bool IsBoolValue(Expression item)
|
||||||
|
{
|
||||||
|
return item.Type == UtilConstants.BoolType &&
|
||||||
|
(item is MemberExpression) &&
|
||||||
|
(item as MemberExpression).Expression != null &&
|
||||||
|
(item as MemberExpression).Expression.Type == typeof(bool?) &&
|
||||||
|
(item as MemberExpression).Member.Name == "Value";
|
||||||
|
}
|
||||||
|
protected static bool IsConvert(Expression item)
|
||||||
|
{
|
||||||
|
return item is UnaryExpression && item.NodeType == ExpressionType.Convert;
|
||||||
|
}
|
||||||
|
protected static bool IsNotMember(Expression item)
|
||||||
|
{
|
||||||
|
return item is UnaryExpression &&
|
||||||
|
item.Type == UtilConstants.BoolType &&
|
||||||
|
(item as UnaryExpression).NodeType == ExpressionType.Not &&
|
||||||
|
(item as UnaryExpression).Operand is MemberExpression &&
|
||||||
|
((item as UnaryExpression).Operand as MemberExpression).Expression != null &&
|
||||||
|
((item as UnaryExpression).Operand as MemberExpression).Expression.NodeType == ExpressionType.Parameter;
|
||||||
|
}
|
||||||
|
protected static bool IsNotParameter(Expression item)
|
||||||
|
{
|
||||||
|
return item is UnaryExpression &&
|
||||||
|
item.Type == UtilConstants.BoolType &&
|
||||||
|
(item as UnaryExpression).NodeType == ExpressionType.Not &&
|
||||||
|
(item as UnaryExpression).Operand is MemberExpression &&
|
||||||
|
((item as UnaryExpression).Operand as MemberExpression).Expression != null &&
|
||||||
|
((item as UnaryExpression).Operand as MemberExpression).Expression.NodeType == ExpressionType.MemberAccess;
|
||||||
|
}
|
||||||
|
protected bool IsSubMethod(MethodCallExpression express)
|
||||||
|
{
|
||||||
|
return SubTools.SubItemsConst.Any(it => express.Object != null && express.Object.Type.Name.StartsWith("Subqueryable`"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -134,6 +134,9 @@
|
|||||||
<Compile Include="Entities\DeleteNavOptions.cs" />
|
<Compile Include="Entities\DeleteNavOptions.cs" />
|
||||||
<Compile Include="Entities\JoinInfoParameter.cs" />
|
<Compile Include="Entities\JoinInfoParameter.cs" />
|
||||||
<Compile Include="ExpressionsToSql\Common\NewExpressionInfo.cs" />
|
<Compile Include="ExpressionsToSql\Common\NewExpressionInfo.cs" />
|
||||||
|
<Compile Include="ExpressionsToSql\ResolveItems\BaseResolve_Helper.cs" />
|
||||||
|
<Compile Include="ExpressionsToSql\ResolveItems\BaseResolve_Validate.cs" />
|
||||||
|
<Compile Include="ExpressionsToSql\ResolveItems\BaseResolve_Property.cs" />
|
||||||
<Compile Include="ExpressionsToSql\ResolveItems\MethodCallExpressionResolve_Helper.cs" />
|
<Compile Include="ExpressionsToSql\ResolveItems\MethodCallExpressionResolve_Helper.cs" />
|
||||||
<Compile Include="ExpressionsToSql\ResolveItems\MethodCallExpressionResolve_BaseDateFomat.cs" />
|
<Compile Include="ExpressionsToSql\ResolveItems\MethodCallExpressionResolve_BaseDateFomat.cs" />
|
||||||
<Compile Include="ExpressionsToSql\Subquery\Items\SubDistinctCount.cs" />
|
<Compile Include="ExpressionsToSql\Subquery\Items\SubDistinctCount.cs" />
|
||||||
|
Reference in New Issue
Block a user