You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

318 lines
16 KiB

using SqlSugar;
using System;
using System.Collections.Generic;
using System.Text;
using System.Linq;
using System.Runtime.CompilerServices;
namespace ReZero.SuperAPI
{
/// <summary>
/// Where
/// </summary>
public partial class QueryCommon : IDataService
{
public QueryMethodInfo Where(Type type, DataModel dataModel, QueryMethodInfo queryObject)
{
List<IConditionalModel> conditionalModels = new List<IConditionalModel>();
List<IFuncModel> funcModels = new List<IFuncModel>();
if (dataModel.DefaultParameters != null)
{
AddDynamicOrderBy(dataModel);
dataModel.WhereRelation = dataModel.WhereRelation ?? WhereRelation.And;
switch (dataModel.WhereRelation)
{
case WhereRelation.And:
And(dataModel, queryObject, conditionalModels);
break;
case WhereRelation.AndAll:
AndAll(dataModel, queryObject, conditionalModels);
break;
case WhereRelation.Or:
Or(dataModel, queryObject, conditionalModels);
break;
case WhereRelation.OrAll:
OrAll(dataModel, queryObject, conditionalModels);
break;
case WhereRelation.Custom:
Custom(dataModel, queryObject, conditionalModels);
break;
case WhereRelation.CustomAll:
CustomAll(dataModel, queryObject, conditionalModels);
break;
}
}
queryObject = queryObject.Where(conditionalModels,true);
foreach (var item in funcModels)
{
queryObject = queryObject.Where(item);
}
return queryObject;
}
private static void AddDynamicOrderBy(DataModel dataModel)
{
if (IsOrderByParameters(dataModel))
{
if (dataModel.OrderDynamicParemters == null)
{
dataModel.OrderDynamicParemters = new List<DataModelDynamicOrderParemter>();
}
var name = dataModel.DefaultParameters.FirstOrDefault(it => it.Name == "OrderByName").Value?.ToString();
var sortType = Convert.ToInt32(dataModel.DefaultParameters.FirstOrDefault(it => it.Name == "OrderByType").Value);
if (!string.IsNullOrEmpty(name))
{
dataModel.OrderDynamicParemters = new List<DataModelDynamicOrderParemter>();
dataModel.OrderDynamicParemters.Add(new DataModelDynamicOrderParemter()
{
FieldName = name,
OrderByType = sortType == 0 ? OrderByType.Asc : OrderByType.Desc
});
}
dataModel.DefaultParameters!.RemoveAll(it => it.Name == "OrderByName" || it.Name == "OrderByType");
}
}
private static bool IsOrderByParameters(DataModel dataModel)
{
return dataModel.DefaultParameters.Any(it => it.Name == "OrderByType") && dataModel.DefaultParameters.Any(it => it.Name == "OrderByName");
}
private void And(DataModel dataModel, QueryMethodInfo queryObject, List<IConditionalModel> conditionalModels)
{
foreach (var item in dataModel.DefaultParameters.Where(it => it.IsMergeWhere!=true&&string.IsNullOrEmpty(it.MergeForName)).Where(it => it.Value + "" != ""))
{
ConvetConditional(dataModel, queryObject, conditionalModels, item);
}
}
private void AndAll(DataModel dataModel, QueryMethodInfo queryObject, List<IConditionalModel> conditionalModels)
{
foreach (var item in dataModel.DefaultParameters.Where(it => it.IsMergeWhere != true&& string.IsNullOrEmpty(it.MergeForName)))
{
ConvetConditional(dataModel, queryObject, conditionalModels, item);
}
}
private void Or(DataModel dataModel, QueryMethodInfo queryObject, List<IConditionalModel> conditionalModels)
{
foreach (var item in dataModel.DefaultParameters.Where(it => it.IsMergeWhere != true&& string.IsNullOrEmpty(it.MergeForName)).Where(it => it.Value + "" != ""))
{
ConvetConditional(dataModel, queryObject, conditionalModels, item);
}
var conditionalList = conditionalModels.Select(it=>new KeyValuePair<WhereType, ConditionalModel>(WhereType.Or,(ConditionalModel)it)).ToList();
conditionalModels.Clear();
conditionalModels.Add(new ConditionalCollections()
{
ConditionalList= conditionalList,
});
if (conditionalList.Count == 0)
{
conditionalModels.Clear();
conditionalModels.Add(new ConditionalModel()
{
FieldName = UtilMethods.FieldNameSql(),
ConditionalType = ConditionalType.Equal,
FieldValue = PubConst.Orm_SqlFalseString
});
}
}
private void OrAll(DataModel dataModel, QueryMethodInfo queryObject, List<IConditionalModel> conditionalModels)
{
foreach (var item in dataModel.DefaultParameters.Where(it => it.IsMergeWhere != true&& string.IsNullOrEmpty(it.MergeForName)))
{
ConvetConditional(dataModel, queryObject, conditionalModels, item);
}
var conditionalList = conditionalModels.Select(it => new KeyValuePair<WhereType, ConditionalModel>(WhereType.Or, (ConditionalModel)it)).ToList();
conditionalModels.Clear();
conditionalModels.Add(new ConditionalCollections()
{
ConditionalList = conditionalList,
});
if (conditionalList.Count == 0)
{
conditionalModels.Clear();
conditionalModels.Add(new ConditionalModel()
{
FieldName = UtilMethods.FieldNameSql(),
ConditionalType = ConditionalType.Equal,
FieldValue = PubConst.Orm_SqlFalseString
});
}
}
private void Custom(DataModel dataModel, QueryMethodInfo queryObject, List<IConditionalModel> conditionalModels)
{
var temp = dataModel.WhereRelationTemplate+string.Empty;
List<SugarParameter> sugarParameters = new List<SugarParameter>();
var index = 0;
foreach (var item in dataModel.DefaultParameters!.Where(it => it.IsMergeWhere != true))
{
index++;
ConvetConditional(dataModel, queryObject, conditionalModels, item);
var conditional=conditionalModels.Last();
var sql = queryObject.Context.Utilities.ConditionalModelsToSql(new List<IConditionalModel>() { conditional }, index);
if (item.ValueIsReadOnly)
{
temp = temp.Replace($"{{{item.Id}}}", sql.Key);
sugarParameters.AddRange(sql.Value);
}
else if (item.Value?.Equals(string.Empty)==true)
{
temp = temp.Replace($"{{{item.Id}}}",$" 1=1 ");
}
else
{
temp = temp.Replace($"{{{item.Id}}}", sql.Key);
sugarParameters.AddRange(sql.Value);
}
}
queryObject.Where(temp, sugarParameters);
conditionalModels.Clear();
}
private void CustomAll(DataModel dataModel, QueryMethodInfo queryObject, List<IConditionalModel> conditionalModels)
{
var temp = dataModel.WhereRelationTemplate + string.Empty;
List<SugarParameter> sugarParameters = new List<SugarParameter>();
var index = 0;
foreach (var item in dataModel.DefaultParameters.Where(it=>it.IsMergeWhere!=true)!)
{
index++;
ConvetConditional(dataModel, queryObject, conditionalModels, item);
var conditional = conditionalModels.Last();
var sql = queryObject.Context.Utilities.ConditionalModelsToSql(new List<IConditionalModel>() { conditional }, index);
if (item.ValueIsReadOnly)
{
temp = temp.Replace($"{{{item.Id}}}", sql.Key);
sugarParameters.AddRange(sql.Value);
}
else
{
temp = temp.Replace($"{{{item.Id}}}", sql.Key);
sugarParameters.AddRange(sql.Value);
}
}
queryObject.Where(temp, sugarParameters);
conditionalModels.Clear();
}
private void ConvetConditional(DataModel dataModel, QueryMethodInfo queryObject, List<IConditionalModel> conditionalModels, DataModelDefaultParameter? item)
{
var preoperyName = item?.Name;
item!.Name =_sqlSugarClient!.EntityMaintenance.GetDbColumnName(item.PropertyName??item.Name, queryObject.EntityType);
if (item.Value != null)
{
if (item.ValueType == typeof(bool).Name)
{
if (item.Value?.ToString().EqualsCase("true") == true || item.Value?.ToString().EqualsCase("false") == true)
{
item.Value = Convert.ToBoolean(item.Value);
}
else
{
item.Value = Convert.ToBoolean(Convert.ToInt32(item.Value));
}
}
}
if (item.ValueType == PubConst.Orm_WhereValueTypeClaimKey)
{
if (!dataModel.ClaimList.Any(it => it.Key?.ToLower() == item.Value?.ToString()?.ToLower()))
{
throw new SqlSugarException(TextHandler.GetCommonText("授权失败,没有找到Claim Key" + item.Value, "Authorization failure ,ClaimList Not Found Key:" + item.Value));
}
var value = dataModel.ClaimList.FirstOrDefault(it => it.Key?.ToLower() == item.Value?.ToString()?.ToLower()).Value;
item.Value = value;
item.ValueType = value?.GetType()?.Name;
}
var forNames = dataModel.DefaultParameters.Where(it => it.MergeForName?.ToLower() == (preoperyName)?.ToLower()).ToList();
if (forNames.Any())
{
foreach (var forItem in forNames)
{
forItem.Name = _sqlSugarClient!.EntityMaintenance.GetDbColumnName(forItem.Name, queryObject.EntityType);
}
ConvetConditionalModelForNames(conditionalModels, item, forNames);
}
else
{
ConvetConditionalModelDefault(conditionalModels, item);
}
}
private void ConvetConditionalModelForNames(List<IConditionalModel> conditionalModels, DataModelDefaultParameter item, List<DataModelDefaultParameter> forNames)
{
var colItem = new ConditionalModel() { FieldName = GetFieldName(item), ConditionalType = ConditionalType.Like, CSharpTypeName = item.ValueType, FieldValue = item.Value + "" };
var conditionalCollections = new ConditionalCollections()
{
ConditionalList = new List<KeyValuePair<WhereType, ConditionalModel>>()
{
new KeyValuePair<WhereType, ConditionalModel>(WhereType.And,colItem)
}
};
foreach (var it in forNames)
{
var colItemNext = new ConditionalModel() { FieldName = GetFieldName(it), ConditionalType = ConditionalType.Like, CSharpTypeName = item.ValueType, FieldValue = item.Value + "" };
conditionalCollections.ConditionalList.Add(new KeyValuePair<WhereType, ConditionalModel>(WhereType.Or, colItemNext));
}
conditionalModels.Add(conditionalCollections);
}
private void ConvetConditionalModelDefault(List<IConditionalModel> conditionalModels, DataModelDefaultParameter? item)
{
switch (item?.FieldOperator)
{
case FieldOperatorType.Equal:
conditionalModels.Add(new ConditionalModel() { FieldName =GetFieldName(item), ConditionalType = ConditionalType.Equal, CSharpTypeName = item.ValueType, FieldValue = item.Value + "" });
break;
case FieldOperatorType.NoEqual:
conditionalModels.Add(new ConditionalModel() { FieldName = GetFieldName(item), ConditionalType = ConditionalType.NoEqual, CSharpTypeName = item.ValueType, FieldValue = item.Value + "" });
break;
case FieldOperatorType.GreaterThan:
conditionalModels.Add(new ConditionalModel() { FieldName = GetFieldName(item), ConditionalType = ConditionalType.GreaterThan, CSharpTypeName = item.ValueType, FieldValue = item.Value + "" });
break;
case FieldOperatorType.GreaterThanOrEqual:
conditionalModels.Add(new ConditionalModel() { FieldName = GetFieldName(item), ConditionalType = ConditionalType.GreaterThanOrEqual, CSharpTypeName = item.ValueType, FieldValue = item.Value + "" });
break;
case FieldOperatorType.LessThan:
conditionalModels.Add(new ConditionalModel() { FieldName = GetFieldName(item), ConditionalType = ConditionalType.LessThan, CSharpTypeName = item.ValueType, FieldValue = item.Value + "" });
break;
case FieldOperatorType.LessThanOrEqual:
conditionalModels.Add(new ConditionalModel() { FieldName = GetFieldName(item), ConditionalType = ConditionalType.LessThanOrEqual, CSharpTypeName = item.ValueType, FieldValue = item.Value + "" });
break;
case FieldOperatorType.Like:
conditionalModels.Add(new ConditionalModel() { FieldName = GetFieldName(item), ConditionalType = ConditionalType.Like, CSharpTypeName = item.ValueType, FieldValue = item.Value + "" });
break;
case FieldOperatorType.In:
conditionalModels.Add(new ConditionalModel() { FieldName = GetFieldName(item), ConditionalType = ConditionalType.In, CSharpTypeName = item.ValueType, FieldValue = item.Value + "" });
break;
case FieldOperatorType.NotIn:
conditionalModels.Add(new ConditionalModel() { FieldName = GetFieldName(item), ConditionalType = ConditionalType.NotIn, CSharpTypeName = item.ValueType, FieldValue = item.Value + "" });
break;
case FieldOperatorType.LikeLeft:
conditionalModels.Add(new ConditionalModel() { FieldName = GetFieldName(item), ConditionalType = ConditionalType.LikeLeft, CSharpTypeName = item.ValueType, FieldValue = item.Value + "" });
break;
case FieldOperatorType.LikeRight:
conditionalModels.Add(new ConditionalModel() { FieldName = GetFieldName(item), ConditionalType = ConditionalType.LikeRight, CSharpTypeName = item.ValueType, FieldValue = item.Value + "" });
break;
case FieldOperatorType.NoLike:
conditionalModels.Add(new ConditionalModel() { FieldName = GetFieldName(item), ConditionalType = ConditionalType.NoLike, CSharpTypeName = item.ValueType, FieldValue = item.Value + "" });
break;
default:
break;
}
}
private string GetFieldName(DataModelDefaultParameter item)
{
if (this.resultType != null)
{
return item.Name;
}
else
{
return PubConst.Orm_TableDefaultPreName + item.TableIndex + "." + item.Name;
}
}
}
}