using SqlSugar; using System; using System.Collections.Generic; using System.Text; using System.Linq; using System.Data; using Microsoft.Extensions.Primitives; using System.Xml.Linq; namespace ReZero.SuperAPI { /// /// Select /// public partial class QueryCommon : IDataService { public List resultTypeInfos = new List(); private Type? resultType; private QueryMethodInfo Select(Type type, DataModel dataModel, QueryMethodInfo queryObject) { if (IsAnySelect(dataModel)) { queryObject = GetSelectByParameters(type,dataModel, queryObject); } else if (IsAnyJoin(dataModel)) { queryObject = GetDefaultSelect(type, queryObject); } return queryObject; } private QueryMethodInfo GetSelectByParameters(Type type, DataModel dataModel, QueryMethodInfo queryObject) { List selectLists = new List(); foreach (var item in dataModel.SelectParameters ?? new List()) { if (IsSelectMasterAll(item)) { selectLists.Add(GetMasterSelectAll(type)); } else if (IsSelectSubqueryName(item)) { selectLists.Add(item.SubquerySQL!); resultTypeInfos.Add(new ResultTypeInfo() { PropertyName = item.AsName, Type = GetColumnInfo(type, item)?.PropertyInfo?.PropertyType ?? typeof(object) }); } else if (IsSelectJoinName(item)) { var propertyName = _sqlBuilder!.GetTranslationColumnName(item.AsName); var tableInfo = dataModel!.JoinParameters![item.TableIndex - 1]; var name = $"{_sqlBuilder!.GetTranslationColumnName(PubConst.Orm_TableDefaultPreName + item.TableIndex)}.{_sqlBuilder!.GetTranslationColumnName(item.Name)} AS {propertyName} "; selectLists.Add(name); resultTypeInfos.Add(new ResultTypeInfo() { PropertyName = item.AsName, Type = typeof(string) }); } else if (!string.IsNullOrEmpty(item.Name)) { if (string.IsNullOrEmpty(item.AsName)) item.AsName = item.Name; var name = $"{_sqlBuilder!.GetTranslationColumnName(GetSelectFieldName(queryObject, item))} AS {_sqlBuilder!.GetTranslationColumnName(item.AsName)} "; selectLists.Add(name); resultTypeInfos.Add(new ResultTypeInfo() { PropertyName = item.AsName, Type = GetColumnInfo(type, item)?.PropertyInfo?.PropertyType ?? typeof(object) }); } } var resultType=new DynamicTypeBuilder(_sqlSugarClient!,"ViewModel_"+dataModel.ApiId, resultTypeInfos).BuildDynamicType(); queryObject = queryObject.Select(string.Join(",", selectLists), resultType); this.resultType = resultType; return queryObject; } private string GetSelectFieldName(QueryMethodInfo queryObject, DataModelSelectParameters item) { var name = _sqlSugarClient!.EntityMaintenance.GetDbColumnName(item.Name, queryObject.EntityType); return PubConst.Orm_TableDefaultPreName + item.TableIndex + "." + name; } private EntityColumnInfo GetColumnInfo(Type type, DataModelSelectParameters item) { var collumnInfo = _sqlSugarClient!.EntityMaintenance.GetEntityInfo(type).Columns.FirstOrDefault(it=>it.PropertyName.EqualsCase(item.AsName!)); return collumnInfo; } private QueryMethodInfo GetDefaultSelect(Type type, QueryMethodInfo queryObject) { string selectString = GetMasterSelectAll(type); queryObject = queryObject.Select(selectString); return queryObject; } private string GetMasterSelectAll(Type type) { var columns = _sqlSugarClient!.EntityMaintenance.GetEntityInfo(type).Columns.Where(it => !it.IsIgnore) .Select(it => GetEntityColumns(it)).ToList(); var selectString = String.Join(",", columns); return selectString; } private object GetEntityColumns(EntityColumnInfo it) { resultTypeInfos.Add(new ResultTypeInfo() { PropertyName=it.PropertyName,Type=it.PropertyInfo.PropertyType }); return _sqlBuilder!.GetTranslationColumnName(PubConst.Orm_TableDefaultMasterTableShortName) +"."+ _sqlBuilder!.GetTranslationColumnName(it.DbColumnName) + " AS " + _sqlBuilder!.GetTranslationColumnName(it.PropertyName); } } }