| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427 |
- using System;
- using System.Collections;
- using System.Collections.Generic;
- using System.Data;
- using System.Linq;
- using System.Linq.Expressions;
- using System.Text;
- using System.Text.RegularExpressions;
- using System.Reflection;
- using System.Dynamic;
- using System.Threading.Tasks;
- using System.Collections.ObjectModel;
- using NetTaste;
- using Newtonsoft.Json.Linq;
- using System.Xml.Linq;
- namespace SqlSugar
- {
- public partial class QueryableProvider<T> : QueryableAccessory, ISugarQueryable<T>
- {
- #region Tree
- private List<T> _ToParentListByTreeKey(Expression<Func<T, object>> parentIdExpression, object primaryKeyValue)
- {
- var entity = this.Context.EntityMaintenance.GetEntityInfo<T>();
- var treeKey = entity.Columns.FirstOrDefault(it => it.IsTreeKey);
- List<T> result = new List<T>() { };
- var parentIdName = UtilConvert.ToMemberExpression((parentIdExpression as LambdaExpression).Body).Member.Name;
- var ParentInfo = entity.Columns.First(it => it.PropertyName == parentIdName);
- var parentPropertyName = ParentInfo.DbColumnName;
- var tableName = this.QueryBuilder.GetTableNameString;
- if (this.QueryBuilder.IsSingle() == false)
- {
- if (this.QueryBuilder.JoinQueryInfos.Count > 0)
- {
- tableName = this.QueryBuilder.JoinQueryInfos.First().TableName;
- }
- if (this.QueryBuilder.EasyJoinInfos.Count > 0)
- {
- tableName = this.QueryBuilder.JoinQueryInfos.First().TableName;
- }
- }
- var current = this.Context.Queryable<T>().AS(tableName).Filter(null, this.QueryBuilder.IsDisabledGobalFilter).Where(new List<IConditionalModel>() {
- new ConditionalModel()
- {
- ConditionalType = ConditionalType.Equal,
- CSharpTypeName = treeKey.PropertyInfo.PropertyType.Name,
- FieldValue = primaryKeyValue + "",
- FieldName = treeKey.DbColumnName
- } }).First();
- if (current != null)
- {
- result.Add(current);
- object parentId = ParentInfo.PropertyInfo.GetValue(current, null);
- int i = 0;
- while (parentId != null && this.Context.Queryable<T>().AS(tableName).Filter(null, this.QueryBuilder.IsDisabledGobalFilter).Where(new List<IConditionalModel>() {
- new ConditionalModel()
- {
- ConditionalType = ConditionalType.Equal,
- CSharpTypeName = treeKey.PropertyInfo.PropertyType.Name,
- FieldValue = parentId + "",
- FieldName = treeKey.DbColumnName
- } }).Any())
- {
- Check.Exception(i > 100, ErrorMessage.GetThrowMessage("Dead cycle", "出现死循环或超出循环上限(100),检查最顶层的ParentId是否是null或者0"));
- var parent = this.Context.Queryable<T>().AS(tableName).Filter(null, this.QueryBuilder.IsDisabledGobalFilter).Where(new List<IConditionalModel>() {
- new ConditionalModel()
- {
- ConditionalType = ConditionalType.Equal,
- CSharpTypeName = treeKey.PropertyInfo.PropertyType.Name,
- FieldValue = parentId + "",
- FieldName = treeKey.DbColumnName
- } }).First();
- result.Add(parent);
- parentId = ParentInfo.PropertyInfo.GetValue(parent, null);
- ++i;
- }
- }
- return result;
- }
- private List<T> _ToParentListByTreeKey(Expression<Func<T, object>> parentIdExpression, object primaryKeyValue, Expression<Func<T, bool>> parentWhereExpression)
- {
- var entity = this.Context.EntityMaintenance.GetEntityInfo<T>();
- var treeKey = entity.Columns.FirstOrDefault(it => it.IsTreeKey);
- List<T> result = new List<T>() { };
- var parentIdName = UtilConvert.ToMemberExpression((parentIdExpression as LambdaExpression).Body).Member.Name;
- var ParentInfo = entity.Columns.First(it => it.PropertyName == parentIdName);
- var parentPropertyName = ParentInfo.DbColumnName;
- var tableName = this.QueryBuilder.GetTableNameString;
- if (this.QueryBuilder.IsSingle() == false)
- {
- if (this.QueryBuilder.JoinQueryInfos.Count > 0)
- {
- tableName = this.QueryBuilder.JoinQueryInfos.First().TableName;
- }
- if (this.QueryBuilder.EasyJoinInfos.Count > 0)
- {
- tableName = this.QueryBuilder.JoinQueryInfos.First().TableName;
- }
- }
- var current = this.Context.Queryable<T>().AS(tableName).WhereIF(parentWhereExpression != default, parentWhereExpression).Filter(null, this.QueryBuilder.IsDisabledGobalFilter).Where(new List<IConditionalModel>() {
- new ConditionalModel()
- {
- ConditionalType = ConditionalType.Equal,
- CSharpTypeName = treeKey.PropertyInfo.PropertyType.Name,
- FieldValue = primaryKeyValue + "",
- FieldName = treeKey.DbColumnName
- } }).First();
- if (current != null)
- {
- result.Add(current);
- object parentId = ParentInfo.PropertyInfo.GetValue(current, null);
- int i = 0;
- while (parentId != null && this.Context.Queryable<T>().AS(tableName).WhereIF(parentWhereExpression != default, parentWhereExpression).Filter(null, this.QueryBuilder.IsDisabledGobalFilter).Where(new List<IConditionalModel>() {
- new ConditionalModel()
- {
- ConditionalType = ConditionalType.Equal,
- CSharpTypeName = treeKey.PropertyInfo.PropertyType.Name,
- FieldValue = parentId + "",
- FieldName = treeKey.DbColumnName
- } }).Any())
- {
- Check.Exception(i > 100, ErrorMessage.GetThrowMessage("Dead cycle", "出现死循环或超出循环上限(100),检查最顶层的ParentId是否是null或者0"));
- var parent = this.Context.Queryable<T>().AS(tableName).WhereIF(parentWhereExpression != default, parentWhereExpression).Filter(null, this.QueryBuilder.IsDisabledGobalFilter).Where(new List<IConditionalModel>() {
- new ConditionalModel()
- {
- ConditionalType = ConditionalType.Equal,
- CSharpTypeName = treeKey.PropertyInfo.PropertyType.Name,
- FieldValue = parentId + "",
- FieldName = treeKey.DbColumnName
- } }).First();
- result.Add(parent);
- parentId = ParentInfo.PropertyInfo.GetValue(parent, null);
- ++i;
- }
- }
- return result;
- }
- private async Task<List<T>> _ToParentListByTreeKeyAsync(Expression<Func<T, object>> parentIdExpression, object primaryKeyValue)
- {
- var entity = this.Context.EntityMaintenance.GetEntityInfo<T>();
- var treeKey = entity.Columns.FirstOrDefault(it => it.IsTreeKey);
- List<T> result = new List<T>() { };
- var parentIdName = UtilConvert.ToMemberExpression((parentIdExpression as LambdaExpression).Body).Member.Name;
- var ParentInfo = entity.Columns.First(it => it.PropertyName == parentIdName);
- var parentPropertyName = ParentInfo.DbColumnName;
- var tableName = this.QueryBuilder.GetTableNameString;
- if (this.QueryBuilder.IsSingle() == false)
- {
- if (this.QueryBuilder.JoinQueryInfos.Count > 0)
- {
- tableName = this.QueryBuilder.JoinQueryInfos.First().TableName;
- }
- if (this.QueryBuilder.EasyJoinInfos.Count > 0)
- {
- tableName = this.QueryBuilder.JoinQueryInfos.First().TableName;
- }
- }
- var current = await this.Context.Queryable<T>().AS(tableName).Filter(null, this.QueryBuilder.IsDisabledGobalFilter).Where(new List<IConditionalModel>() {
- new ConditionalModel()
- {
- ConditionalType = ConditionalType.Equal,
- CSharpTypeName = treeKey.PropertyInfo.PropertyType.Name,
- FieldValue = primaryKeyValue + "",
- FieldName = treeKey.DbColumnName
- } }).FirstAsync();
- if (current != null)
- {
- result.Add(current);
- object parentId = ParentInfo.PropertyInfo.GetValue(current, null);
- int i = 0;
- while (parentId != null && await this.Context.Queryable<T>().AS(tableName).Filter(null, this.QueryBuilder.IsDisabledGobalFilter).Where(new List<IConditionalModel>() {
- new ConditionalModel()
- {
- ConditionalType = ConditionalType.Equal,
- CSharpTypeName = treeKey.PropertyInfo.PropertyType.Name,
- FieldValue = parentId + "",
- FieldName = treeKey.DbColumnName
- } }).AnyAsync())
- {
- Check.Exception(i > 100, ErrorMessage.GetThrowMessage("Dead cycle", "出现死循环或超出循环上限(100),检查最顶层的ParentId是否是null或者0"));
- var parent = await this.Context.Queryable<T>().AS(tableName).Filter(null, this.QueryBuilder.IsDisabledGobalFilter).Where(new List<IConditionalModel>() {
- new ConditionalModel()
- {
- ConditionalType = ConditionalType.Equal,
- CSharpTypeName = treeKey.PropertyInfo.PropertyType.Name,
- FieldValue = parentId + "",
- FieldName = treeKey.DbColumnName
- } }).FirstAsync();
- result.Add(parent);
- parentId = ParentInfo.PropertyInfo.GetValue(parent, null);
- ++i;
- }
- }
- return result;
- }
- private async Task<List<T>> _ToParentListByTreeKeyAsync(Expression<Func<T, object>> parentIdExpression, object primaryKeyValue, Expression<Func<T, bool>> parentWhereExpression)
- {
- var entity = this.Context.EntityMaintenance.GetEntityInfo<T>();
- var treeKey = entity.Columns.FirstOrDefault(it => it.IsTreeKey);
- List<T> result = new List<T>() { };
- var parentIdName = UtilConvert.ToMemberExpression((parentIdExpression as LambdaExpression).Body).Member.Name;
- var ParentInfo = entity.Columns.First(it => it.PropertyName == parentIdName);
- var parentPropertyName = ParentInfo.DbColumnName;
- var tableName = this.QueryBuilder.GetTableNameString;
- if (this.QueryBuilder.IsSingle() == false)
- {
- if (this.QueryBuilder.JoinQueryInfos.Count > 0)
- {
- tableName = this.QueryBuilder.JoinQueryInfos.First().TableName;
- }
- if (this.QueryBuilder.EasyJoinInfos.Count > 0)
- {
- tableName = this.QueryBuilder.JoinQueryInfos.First().TableName;
- }
- }
- var current = await this.Context.Queryable<T>().AS(tableName).WhereIF(parentWhereExpression!=default, parentWhereExpression).Filter(null, this.QueryBuilder.IsDisabledGobalFilter).Where(new List<IConditionalModel>() {
- new ConditionalModel()
- {
- ConditionalType = ConditionalType.Equal,
- CSharpTypeName = treeKey.PropertyInfo.PropertyType.Name,
- FieldValue = primaryKeyValue + "",
- FieldName = treeKey.DbColumnName
- } }).FirstAsync();
- if (current != null)
- {
- result.Add(current);
- object parentId = ParentInfo.PropertyInfo.GetValue(current, null);
- int i = 0;
- while (parentId != null && await this.Context.Queryable<T>().AS(tableName).WhereIF(parentWhereExpression!=default, parentWhereExpression).Filter(null, this.QueryBuilder.IsDisabledGobalFilter).Where(new List<IConditionalModel>() {
- new ConditionalModel()
- {
- ConditionalType = ConditionalType.Equal,
- CSharpTypeName = treeKey.PropertyInfo.PropertyType.Name,
- FieldValue = parentId + "",
- FieldName = treeKey.DbColumnName
- } }).AnyAsync())
- {
- Check.Exception(i > 100, ErrorMessage.GetThrowMessage("Dead cycle", "出现死循环或超出循环上限(100),检查最顶层的ParentId是否是null或者0"));
- var parent = await this.Context.Queryable<T>().AS(tableName).WhereIF(parentWhereExpression!=default, parentWhereExpression).Filter(null, this.QueryBuilder.IsDisabledGobalFilter).Where(new List<IConditionalModel>() {
- new ConditionalModel()
- {
- ConditionalType = ConditionalType.Equal,
- CSharpTypeName = treeKey.PropertyInfo.PropertyType.Name,
- FieldValue = parentId + "",
- FieldName = treeKey.DbColumnName
- } }).FirstAsync();
- result.Add(parent);
- parentId = ParentInfo.PropertyInfo.GetValue(parent, null);
- ++i;
- }
- }
- return result;
- }
- private List<T> GetChildList(Expression<Func<T, object>> parentIdExpression, string pkName, List<T> list, object rootValue, bool isContainOneself)
- {
- var exp = (parentIdExpression as LambdaExpression).Body;
- if (exp is UnaryExpression)
- {
- exp = (exp as UnaryExpression).Operand;
- }
- var parentIdName = (exp as MemberExpression).Member.Name;
- var result = BuildChildList(list, pkName, parentIdName, rootValue, isContainOneself);
- return result;
- }
- private static List<T> BuildChildList(List<T> list, string idName, string pIdName, object rootValue, bool isContainOneself)
- {
- var type = typeof(T);
- var idProp = type.GetProperty(idName);
- var pIdProp = type.GetProperty(pIdName);
- var kvpList = list.ToDictionary(x => x, v => idProp.GetValue(v).ObjToString());
- var groupKv = list.GroupBy(x => pIdProp.GetValue(x).ObjToString()).ToDictionary(k => k.Key, v => v.ToList());
- Func<string, List<T>> fc = null;
- fc = (rootVal) =>
- {
- var finalList = new List<T>();
- if (groupKv.TryGetValue(rootVal, out var nextChildList))
- {
- finalList.AddRange(nextChildList);
- foreach (var child in nextChildList)
- {
- finalList.AddRange(fc(kvpList[child]));
- }
- }
- return finalList;
- };
- var result = fc(rootValue.ObjToString());
- if (isContainOneself)
- {
- var root = kvpList.FirstOrDefault(x => x.Value == rootValue.ObjToString()).Key;
- if (root != null)
- {
- result.Insert(0, root);
- }
- }
- return result;
- }
- private List<object> GetPrentIds(List<T> list, object id, EntityColumnInfo pkName, EntityColumnInfo parentName)
- {
- var currentId = id;
- List<object> result = new List<object>();
- result.Add(id);
- while (list.Any(it => pkName.PropertyInfo.GetValue(it).ObjToString()==currentId.ObjToString()))
- {
- var data = list.First(it => pkName.PropertyInfo.GetValue(it).ObjToString() == currentId.ObjToString());
- currentId = parentName.PropertyInfo.GetValue(data);
- result.Add(currentId);
- }
- return result;
- }
- private List<T> TreeAndFilterIds(Expression<Func<T, IEnumerable<object>>> childListExpression, Expression<Func<T, object>> parentIdExpression, object rootValue, object[] childIds, ref List<T> list)
- {
- var entity = this.Context.EntityMaintenance.GetEntityInfo<T>();
- var pk = GetTreeKey(entity);
- var pkColumn = entity.Columns.FirstOrDefault(z => z.PropertyName == pk);
- var newIds = new List<object>();
- string parentIdName = GetParentName(parentIdExpression);
- var parentColumn = entity.Columns.FirstOrDefault(z => z.PropertyName == parentIdName);
- foreach (var id in childIds)
- {
- newIds.AddRange(GetPrentIds(list, id, pkColumn, parentColumn));
- }
- list = list.Where(z => newIds.Any(it => it.ObjToString()==pkColumn.PropertyInfo.GetValue(z).ObjToString())).ToList();
- return GetTreeRoot(childListExpression, parentIdExpression, pk, list, rootValue);
- }
- private List<T> TreeAndFilterIds(Expression<Func<T, IEnumerable<object>>> childListExpression, Expression<Func<T, object>> parentIdExpression, Expression<Func<T, object>> primaryKeyExpresion, object rootValue, object[] childIds, ref List<T> list)
- {
- var entity = this.Context.EntityMaintenance.GetEntityInfo<T>();
- var pk = ExpressionTool.GetMemberName(primaryKeyExpresion);
- var pkColumn = entity.Columns.FirstOrDefault(z => z.PropertyName == pk);
- var newIds = new List<object>();
- string parentIdName = GetParentName(parentIdExpression);
- var parentColumn = entity.Columns.FirstOrDefault(z => z.PropertyName == parentIdName);
- foreach (var id in childIds)
- {
- newIds.AddRange(GetPrentIds(list, id, pkColumn, parentColumn));
- }
- list = list.Where(z => newIds.Any(it => it.ObjToString() == pkColumn.PropertyInfo.GetValue(z).ObjToString())).ToList();
- return GetTreeRoot(childListExpression, parentIdExpression, pk, list, rootValue);
- }
- internal List<T> GetTreeRoot(Expression<Func<T, IEnumerable<object>>> childListExpression, Expression<Func<T, object>> parentIdExpression, string pk, List<T> list, object rootValue)
- {
- var childName = ((childListExpression as LambdaExpression).Body as MemberExpression).Member.Name;
- string parentIdName = GetParentName(parentIdExpression);
- return UtilMethods.BuildTree(this.Context,list, pk, parentIdName, childName, rootValue)?.ToList() ?? default;
- }
- private static string GetParentName(Expression<Func<T, object>> parentIdExpression)
- {
- var exp = (parentIdExpression as LambdaExpression).Body;
- if (exp is UnaryExpression)
- {
- exp = (exp as UnaryExpression).Operand;
- }
- var parentIdName = (exp as MemberExpression).Member.Name;
- return parentIdName;
- }
- public List<T> GetTreeChildList(List<T> alllist, object pkValue, string pkName, string childName, string parentIdName)
- {
- var result = alllist.Where(it =>
- {
- var value = it.GetType().GetProperty(parentIdName).GetValue(it);
- return value.ObjToString() == pkValue.ObjToString();
- }).ToList();
- if (result != null && result.Count > 0)
- {
- foreach (var item in result)
- {
- var itemPkValue = item.GetType().GetProperty(pkName).GetValue(item);
- item.GetType().GetProperty(childName).SetValue(item, GetTreeChildList(alllist, itemPkValue, pkName, childName, parentIdName));
- }
- }
- return result;
- }
- private static string GetTreeKey(EntityInfo entity)
- {
- Check.Exception(entity.Columns.Where(it => it.IsPrimarykey || it.IsTreeKey).Count() == 0, "need IsPrimary=true Or IsTreeKey=true");
- string pk = entity.Columns.Where(it => it.IsTreeKey).FirstOrDefault()?.PropertyName;
- if (pk == null)
- pk = entity.Columns.Where(it => it.IsPrimarykey).FirstOrDefault()?.PropertyName;
- return pk;
- }
- #endregion
- #region Count
- protected int GetCount()
- {
- var sql = string.Empty;
- ToSqlBefore();
- sql = QueryBuilder.ToSqlString();
- sql = QueryBuilder.ToCountSql(sql);
- var result = Context.Ado.GetInt(sql, QueryBuilder.Parameters.ToArray());
- return result;
- }
- protected async Task<int> GetCountAsync()
- {
- var sql = string.Empty;
- ToSqlBefore();
- sql = QueryBuilder.ToSqlString();
- sql = QueryBuilder.ToCountSql(sql);
- var result = Convert.ToInt32(await Context.Ado.GetScalarAsync(sql, QueryBuilder.Parameters.ToArray()));
- return result;
- }
- private void _CountEnd(MappingTableList expMapping)
- {
- RestoreMapping();
- QueryBuilder.IsCount = false;
- if (expMapping.Count > 0)
- {
- if (this.QueryableMappingTableList == null)
- {
- this.QueryableMappingTableList = new MappingTableList();
- }
- this.QueryableMappingTableList.Add(expMapping.First());
- }
- }
- private void _CountBegin(out MappingTableList expMapping, out int result)
- {
- expMapping = new MappingTableList();
- if (QueryBuilder.EntityName == "ExpandoObject" && this.Context.MappingTables.Any(it => it.EntityName == "ExpandoObject"))
- {
- expMapping.Add("ExpandoObject", this.Context.MappingTables.First(it => it.EntityName == "ExpandoObject").DbTableName);
- }
- InitMapping();
- QueryBuilder.IsCount = true;
- result = 0;
- }
- #endregion
- #region Min Max Sum Gvg
- protected TResult _Min<TResult>(Expression expression)
- {
- if (this.QueryBuilder.IsSqlQuery)
- {
- this.QueryBuilder.IsSqlQuery = false;
- }
- QueryBuilder.CheckExpression(expression, "Main");
- var isSingle = QueryBuilder.IsSingle();
- var lamResult = QueryBuilder.GetExpressionValue(expression, isSingle ? ResolveExpressType.FieldSingle : ResolveExpressType.FieldMultiple);
- var result = Min<TResult>(lamResult.GetResultString());
- QueryBuilder.SelectValue = null;
- return result;
- }
- protected async Task<TResult> _MinAsync<TResult>(Expression expression)
- {
- if (this.QueryBuilder.IsSqlQuery)
- {
- this.QueryBuilder.IsSqlQuery = false;
- }
- QueryBuilder.CheckExpression(expression, "Main");
- var isSingle = QueryBuilder.IsSingle();
- var lamResult = QueryBuilder.GetExpressionValue(expression, isSingle ? ResolveExpressType.FieldSingle : ResolveExpressType.FieldMultiple);
- var result = await MinAsync<TResult>(lamResult.GetResultString());
- QueryBuilder.SelectValue = null;
- return result;
- }
- protected TResult _Avg<TResult>(Expression expression)
- {
- if (this.QueryBuilder.IsSqlQuery)
- {
- this.QueryBuilder.IsSqlQuery = false;
- }
- QueryBuilder.CheckExpression(expression, "Avg");
- var isSingle = QueryBuilder.IsSingle();
- var lamResult = QueryBuilder.GetExpressionValue(expression, isSingle ? ResolveExpressType.FieldSingle : ResolveExpressType.FieldMultiple);
- return Avg<TResult>(lamResult.GetResultString());
- }
- protected async Task<TResult> _AvgAsync<TResult>(Expression expression)
- {
- if (this.QueryBuilder.IsSqlQuery)
- {
- this.QueryBuilder.IsSqlQuery = false;
- }
- QueryBuilder.CheckExpression(expression, "Avg");
- var isSingle = QueryBuilder.IsSingle();
- var lamResult = QueryBuilder.GetExpressionValue(expression, isSingle ? ResolveExpressType.FieldSingle : ResolveExpressType.FieldMultiple);
- return await AvgAsync<TResult>(lamResult.GetResultString());
- }
- protected TResult _Max<TResult>(Expression expression)
- {
- if (this.QueryBuilder.IsSqlQuery)
- {
- this.QueryBuilder.IsSqlQuery = false;
- }
- QueryBuilder.CheckExpression(expression, "Max");
- var isSingle = QueryBuilder.IsSingle();
- var lamResult = QueryBuilder.GetExpressionValue(expression, isSingle ? ResolveExpressType.FieldSingle : ResolveExpressType.FieldMultiple);
- var reslut = Max<TResult>(lamResult.GetResultString());
- QueryBuilder.SelectValue = null;
- return reslut;
- }
- protected async Task<TResult> _MaxAsync<TResult>(Expression expression)
- {
- if (this.QueryBuilder.IsSqlQuery)
- {
- this.QueryBuilder.IsSqlQuery = false;
- }
- QueryBuilder.CheckExpression(expression, "Max");
- var isSingle = QueryBuilder.IsSingle();
- var lamResult = QueryBuilder.GetExpressionValue(expression, isSingle ? ResolveExpressType.FieldSingle : ResolveExpressType.FieldMultiple);
- var reslut = await MaxAsync<TResult>(lamResult.GetResultString());
- QueryBuilder.SelectValue = null;
- return reslut;
- }
- protected TResult _Sum<TResult>(Expression expression)
- {
- if (this.QueryBuilder.IsSqlQuery)
- {
- this.QueryBuilder.IsSqlQuery = false;
- }
- QueryBuilder.CheckExpression(expression, "Sum");
- var isSingle = QueryBuilder.IsSingle();
- var lamResult = QueryBuilder.GetExpressionValue(expression, isSingle ? ResolveExpressType.FieldSingle : ResolveExpressType.FieldMultiple);
- var reslut = Sum<TResult>(lamResult.GetResultString());
- QueryBuilder.SelectValue = null;
- return reslut;
- }
- protected async Task<TResult> _SumAsync<TResult>(Expression expression)
- {
- if (this.QueryBuilder.IsSqlQuery)
- {
- this.QueryBuilder.IsSqlQuery = false;
- }
- QueryBuilder.CheckExpression(expression, "Sum");
- var isSingle = QueryBuilder.IsSingle();
- var lamResult = QueryBuilder.GetExpressionValue(expression, isSingle ? ResolveExpressType.FieldSingle : ResolveExpressType.FieldMultiple);
- var reslut = await SumAsync<TResult>(lamResult.GetResultString());
- QueryBuilder.SelectValue = null;
- return reslut;
- }
- #endregion
- #region Master Slave
- private void RestChangeMasterQuery(bool isChangeQueryableMasterSlave)
- {
- if (isChangeQueryableMasterSlave)
- this.Context.Ado.IsDisableMasterSlaveSeparation = false;
- }
- private bool GetIsMasterQuery()
- {
- var isChangeQueryableMasterSlave =
- this.QueryBuilder.IsDisableMasterSlaveSeparation == true &&
- this.Context.Ado.IsDisableMasterSlaveSeparation == false &&
- this.Context.Ado.Transaction == null;
- if (isChangeQueryableMasterSlave)
- this.Context.Ado.IsDisableMasterSlaveSeparation = true;
- return isChangeQueryableMasterSlave;
- }
- private void RestChangeSlaveQuery(bool isChangeQueryableSlaveSlave)
- {
- if (isChangeQueryableSlaveSlave)
- this.Context.Ado.IsDisableMasterSlaveSeparation = true;
- }
- private bool GetIsSlaveQuery()
- {
- var isChangeQueryableMasterSlave =
- this.QueryBuilder.IsEnableMasterSlaveSeparation == true &&
- this.Context.Ado.IsDisableMasterSlaveSeparation == true &&
- this.Context.Ado.Transaction == null;
- if (isChangeQueryableMasterSlave)
- this.Context.Ado.IsDisableMasterSlaveSeparation = false;
- return isChangeQueryableMasterSlave;
- }
- #endregion
- #region Navigate
- internal bool IsAppendNavColumns()
- {
- return this.QueryBuilder.Includes.HasValue() && this.QueryBuilder.AppendNavInfo == null;
- }
- internal void SetAppendNavColumns(Expression expression)
- {
- var tResultType = expression.Type;
- var dic = ExpressionTool.GetNewExpressionItemList(expression);
- var navs = this.QueryBuilder.Includes;
- var navManages = navs.Cast<NavigatManager<T>>();
- if (navManages.FirstOrDefault() == null) return;
- this.QueryBuilder.AppendNavInfo = new AppendNavInfo();
- var navInfo = this.QueryBuilder.AppendNavInfo;
- var entityColumns = this.EntityInfo.Columns;
- var pkColumns = entityColumns.Where(it => it.IsPrimarykey);
- AddAppendProperties(navManages, navInfo, entityColumns, pkColumns);
- AddMappingNavProperties(dic, navInfo, entityColumns);
- }
- private static void AddMappingNavProperties(Dictionary<string, Expression> dic, AppendNavInfo navInfo, List<EntityColumnInfo> entityColumns)
- {
- foreach (var item in dic)
- {
- var value = item.Value;
- var expressionTree = new ExpressionTreeVisitor().GetExpressions(value);
- var isSqlMethod = expressionTree.Any()&&ExpressionTool.GetMethodName(expressionTree.Last()).IsIn("Any", "Count");
- if (expressionTree.Any()&&isSqlMethod==false)
- {
-
- var name = ExpressionTool.GetMemberName(expressionTree.First());
- if (name != null && entityColumns.Any(it => it.Navigat != null && it.PropertyName == name))
- {
- var mappingNavColumnInfo = new MappingNavColumnInfo()
- {
- ExpressionList = expressionTree,
- Name = name
- };
- navInfo.MappingNavProperties.Add(item.Key, mappingNavColumnInfo);
- }
- }
- }
- }
- private static void AddAppendProperties(IEnumerable<NavigatManager<T>> navManages, AppendNavInfo navInfo, List<EntityColumnInfo> entityColumns, IEnumerable<EntityColumnInfo> pkColumns)
- {
- foreach (var item in pkColumns)
- {
- navInfo.AppendProperties.Add(item.PropertyName, item.DbColumnName);
- }
- foreach (var item in navManages)
- {
- var FirstExp = item.Expressions.First();
- var navName = ExpressionTool.GetMemberName(FirstExp);
- if (FirstExp is LambdaExpression &&ExpressionTool.GetMethodName((FirstExp as LambdaExpression).Body) == "ToList")
- {
- navName = ExpressionTool.GetFirstTypeNameFromExpression(FirstExp);
- }
- var navColumn = entityColumns.Where(it => it.IsPrimarykey == false).Where(it => it.Navigat != null).FirstOrDefault(it => it.PropertyName == navName);
- if (navColumn != null && navColumn.Navigat.NavigatType != NavigateType.ManyToMany)
- {
- var name1 = navColumn.Navigat.Name;
- var name2 = navColumn.Navigat.Name2;
- var name1Column = entityColumns.FirstOrDefault(it => it.PropertyName == name1);
- var name2Column = entityColumns.FirstOrDefault(it => it.PropertyName == name2);
- if (name1Column != null)
- {
- if (!navInfo.AppendProperties.ContainsKey(name1Column.PropertyName))
- navInfo.AppendProperties.Add(name1Column.PropertyName, name1Column.DbColumnName);
- }
- if (name2Column != null)
- {
- if (!navInfo.AppendProperties.ContainsKey(name2Column.PropertyName))
- navInfo.AppendProperties.Add(name2Column.PropertyName, name2Column.DbColumnName);
- }
- if (navColumn.Navigat.NavigatType == NavigateType.Dynamic && name1.HasValue())
- {
- var jarray= JArray.Parse(name1);
- foreach (var jitem in jarray)
- {
- var columnInfo = entityColumns.FirstOrDefault(it =>
- it.PropertyName.EqualCase(jitem["m"].ToString())||
- it.DbColumnName.EqualCase(jitem["m"].ToString()));
- if (columnInfo != null)
- {
- if(!navInfo.AppendProperties.ContainsKey(columnInfo.PropertyName))
- navInfo.AppendProperties.Add(columnInfo.PropertyName, columnInfo.DbColumnName);
- }
- }
- }
- }
- }
- }
- private async Task _InitNavigatAsync<TResult>(List<TResult> result)
- {
- if (this.QueryBuilder.Includes != null)
- {
- await Task.Run(() => { _InitNavigat(result); });
- }
- }
- private void _InitNavigat<TResult>(List<TResult> result)
- {
- if (this.QueryBuilder.Includes != null)
- {
- var managers = (this.QueryBuilder.Includes as List<object>);
- if (this.QueryBuilder.AppendNavInfo?.AppendProperties?.Any()==true)
- {
- if (result.HasValue())
- {
- SelectNavQuery(result, managers);
- }
- }
- else
- {
- foreach (var it in managers)
- {
- var manager = it as NavigatManager<TResult>;
- if (manager != null)
- {
- manager.RootList = result;
- manager.Execute();
- }
- }
- }
- }
- }
- private void SelectNavQuery<TResult>(List<TResult> result, List<object> managers)
- {
- if (result.Any())
- {
- IList outList = null;
- foreach (var it in managers)
- {
- var manager = it;
- var p = it.GetType().GetProperty("RootList");
- var tType = it.GetType().GenericTypeArguments[0];
- var allColumns = this.Context.EntityMaintenance.GetEntityInfo(tType)
- .Columns;
- var columns = allColumns
- .Where(a => this.QueryBuilder.AppendNavInfo.Result.First().result.ContainsKey("SugarNav_" + a.PropertyName))
- .ToList();
- var listType = typeof(List<>).MakeGenericType(tType);
- if (outList == null)
- {
- outList = SelectNavQuery_SetList(result, it, p, tType, columns, listType);
- }
- else
- {
- p.SetValue(it, outList);
- }
- it.GetType().GetMethod("Execute").Invoke(it, null);
- SelectNavQuery_MappingList(it, result, outList, allColumns.Where(a => a.Navigat != null).ToList());
- }
- }
- }
- private void SelectNavQuery_MappingList<TResult>(object it,List<TResult> result, IList outList,List<EntityColumnInfo> columnInfos)
- {
- for (int i = 0; i < result.Count; i++)
- {
- var leftObject = result[i];
- var rightObject = outList[i];
- foreach (var item in this.QueryBuilder.AppendNavInfo.MappingNavProperties)
- {
- var rightName = item.Value.Name;
- var rightColumnInfo = columnInfos.FirstOrDefault(a => a.PropertyName == rightName);
- var rightValue=rightColumnInfo.PropertyInfo.GetValue(rightObject);
- var leftName = item.Key;
- //// var rightColumn=col
- // object value = item;
- if (item.Value.ExpressionList.Count > 1 && rightValue != null)
- {
- //foreach (var callExp in item.Value.ExpressionList.Skip(1))
- //{
- try
- {
- MethodCallExpression meExp = (MethodCallExpression)item.Value.ExpressionList.Last();
- ParameterExpression ps = ExpressionTool.GetParameters(meExp).First();
- var comExp = Expression.Lambda(meExp, ps);
- var obj = comExp.Compile();
- // 传递参数值
- var leftValue = obj.DynamicInvoke(rightObject);
- UtilMethods.SetAnonymousObjectPropertyValue(leftObject, leftName, leftValue);
- }
- catch(Exception ex)
- {
- var errorExp = item.Value.ExpressionList.Last().ToString();
- Check.ExceptionEasy($"{errorExp} no support,{ex.Message}", $"{errorExp}语法不支持,请查SqlSugar文档询导航DTO用法,{ex.Message}");
- }
- // // 重新构造Lambda表达式,将参数替换为新的参数,方法调用替换为新的方法调用
- // var newExpression = Expression.Lambda<Func<X, List<int>>>(newMethodCallExpr, paramExpr);
- // Expression.Call(callExp, (callExp as MethodCallExpression).Method,new )
- // var propertyExpr = Expression.Property(paramExpr, rightName);
- // }
- }
- else if(rightValue != null)
- {
- //leftObject.GetType().GetProperty(leftName).SetValue(leftObject, rightValue);
- UtilMethods.SetAnonymousObjectPropertyValue(leftObject, leftName, rightValue);
- }
- }
- }
- }
-
- private IList SelectNavQuery_SetList<TResult>(List<TResult> result, object it, PropertyInfo p, Type tType, List<EntityColumnInfo> columns, Type listType)
- {
- var outList = Activator.CreateInstance(listType);
- p.SetValue(it, outList);
- var index = 0;
- foreach (var item in result)
- {
- var addItem = Activator.CreateInstance(tType);
- var appendResult = this.QueryBuilder.AppendNavInfo.Result[index];
- foreach (var kv in appendResult.result)
- {
- var propertyName = kv.Key.Replace("SugarNav_", "");
- var propertyInfo = columns.First(i => i.PropertyName == propertyName).PropertyInfo;
- if (kv.Value is decimal &&UtilMethods.GetUnderType(propertyInfo.PropertyType).IsIn(typeof(int), typeof(long)))
- {
-
- var changeValue = UtilMethods.ChangeType2(kv.Value, propertyInfo.PropertyType);
- propertyInfo.SetValue(addItem, changeValue);
- }
- else if (kv.Value == DBNull.Value && UtilMethods.GetUnderType(propertyInfo.PropertyType).IsIn(typeof(int), typeof(long)))
- {
- var changeValue = UtilMethods.ChangeType2(0, propertyInfo.PropertyType);
- propertyInfo.SetValue(addItem, changeValue);
- }
- else if (kv.Value == DBNull.Value)
- {
- propertyInfo.SetValue(addItem,null);
- }
- else if (UtilMethods.GetUnderType(propertyInfo.PropertyType) == typeof(Guid) && kv.Value is string)
- {
- propertyInfo.SetValue(addItem, new Guid(kv.Value.ToString()));
- }
- else
- {
- propertyInfo.SetValue(addItem, kv.Value);
- }
- }
- (outList as IList).Add(addItem);
- index++;
- }
- return outList as IList;
- }
- private bool IsSelectNavQuery()
- {
- return this.QueryBuilder.SelectValue.HasValue() && this.QueryBuilder.NoCheckInclude == false;
- }
- protected void _Mapper<TResult>(List<TResult> result)
- {
- if (this.EntityInfo.Columns.Any(it => it.IsTranscoding))
- {
- foreach (var item in result)
- {
- foreach (var column in this.EntityInfo.Columns.Where(it => it.IsTranscoding))
- {
- var value = column.PropertyInfo.GetValue(item, null);
- if (value != null)
- {
- column.PropertyInfo.SetValue(item, UtilMethods.DecodeBase64(value.ToString()), null);
- }
- }
- }
- }
- if (this.Mappers.HasValue())
- {
- foreach (var mapper in this.Mappers)
- {
- if (typeof(TResult) == typeof(T))
- {
- mapper(result.Select(it => (T)Convert.ChangeType(it, typeof(T))).ToList());
- }
- else
- {
- Check.Exception(true, "{0} and {1} are not a type, Try .select().mapper().ToList", typeof(TResult).FullName, typeof(T).FullName);
- }
- }
- }
- if (this.MapperAction != null)
- {
- foreach (TResult item in result)
- {
- if (typeof(TResult) == typeof(T))
- {
- foreach (var mapper in this.MapperAction)
- {
- mapper((T)(item as object));
- }
- }
- else
- {
- Check.Exception(true, "{0} and {1} are not a type, Try .select().mapper().ToList", typeof(TResult).FullName, typeof(T).FullName);
- }
- }
- }
- if (this.MapperActionWithCache != null)
- {
- if (typeof(TResult) == typeof(T))
- {
- var list = (List<T>)Convert.ChangeType(result, typeof(List<T>));
- var mapperCache = new MapperCache<T>(list, this.Context);
- foreach (T item in list)
- {
- mapperCache.GetIndex = 0;
- this.MapperActionWithCache(item, mapperCache);
- }
- }
- else
- {
- Check.Exception(true, "{0} and {1} are not a type, Try .select().mapper().ToList", typeof(TResult).FullName, typeof(T).FullName);
- }
- }
- }
- private ISugarQueryable<T> _Mapper<TObject>(Expression mapperObject, Expression mapperField)
- {
- if ((mapperObject as LambdaExpression).Body is UnaryExpression)
- {
- mapperObject = ((mapperObject as LambdaExpression).Body as UnaryExpression).Operand;
- }
- else
- {
- mapperObject = (mapperObject as LambdaExpression).Body;
- }
- if ((mapperField as LambdaExpression).Body is UnaryExpression)
- {
- mapperField = ((mapperField as LambdaExpression).Body as UnaryExpression).Operand;
- }
- else
- {
- mapperField = (mapperField as LambdaExpression).Body;
- }
- Check.Exception(mapperObject is MemberExpression == false || mapperField is MemberExpression == false, ".Mapper() parameter error");
- var mapperObjectExp = mapperObject as MemberExpression;
- var mapperFieldExp = mapperField as MemberExpression;
- Check.Exception(mapperFieldExp.Type.IsClass(), ".Mapper() parameter error");
- var objType = mapperObjectExp.Type;
- var filedType = mapperFieldExp.Expression.Type;
- Check.Exception(objType != typeof(TObject) && objType != typeof(List<TObject>), ".Mapper() parameter error");
- if (objType == typeof(List<TObject>))
- {
- objType = typeof(TObject);
- }
- var filedName = mapperFieldExp.Member.Name;
- var objName = mapperObjectExp.Member.Name;
- var filedEntity = this.Context.EntityMaintenance.GetEntityInfo(objType);
- var objEntity = this.Context.EntityMaintenance.GetEntityInfo(filedType);
- var isSelf = filedType == typeof(T);
- if (Mappers == null)
- Mappers = new List<Action<List<T>>>();
- if (isSelf)
- {
- Action<List<T>> mapper = (entitys) =>
- {
- if (entitys.IsNullOrEmpty() || !entitys.Any()) return;
- var entity = entitys.First();
- var whereCol = filedEntity.Columns.FirstOrDefault(it => it.PropertyName.Equals(filedName, StringComparison.CurrentCultureIgnoreCase));
- if (whereCol == null)
- {
- whereCol = filedEntity.Columns.FirstOrDefault(it => it.IsPrimarykey == true);
- }
- if (whereCol == null)
- {
- whereCol = filedEntity.Columns.FirstOrDefault(it => GetPrimaryKeys().Any(pk => pk.Equals(it.DbColumnName, StringComparison.CurrentCultureIgnoreCase)));
- }
- if (whereCol == null)
- {
- whereCol = filedEntity.Columns.FirstOrDefault(it => it.PropertyName.Equals("id", StringComparison.CurrentCultureIgnoreCase));
- }
- if (whereCol == null)
- {
- whereCol = filedEntity.Columns.FirstOrDefault(it => (it.PropertyName).Equals(it.EntityName + "id", StringComparison.CurrentCultureIgnoreCase));
- }
- if (whereCol == null)
- {
- Check.Exception(true, ".Mapper() parameter error");
- }
- List<string> inValues = entitys.Select(it => it.GetType().GetProperty(filedName).GetValue(it, null).ObjToString()).ToList();
- if (inValues != null && inValues.Any() && UtilMethods.GetUnderType(entitys.First().GetType().GetProperty(filedName).PropertyType) == UtilConstants.GuidType)
- {
- inValues = inValues.Select(x => x == "" ? "null" : x).Distinct().ToList();
- }
- List<IConditionalModel> wheres = new List<IConditionalModel>()
- {
- new ConditionalModel()
- {
- FieldName=this.SqlBuilder.GetTranslationColumnName(whereCol.DbColumnName),
- ConditionalType= ConditionalType.In,
- FieldValue=string.Join(",",inValues.Distinct()),
- CSharpTypeName=whereCol.PropertyInfo.PropertyType.Name
- }
- };
- var list = this.Context.Queryable<TObject>().Where(wheres).ToList();
- foreach (var item in entitys)
- {
- var whereValue = item.GetType().GetProperty(filedName).GetValue(item, null);
- var setValue = list.Where(x => x.GetType().GetProperty(whereCol.PropertyName).GetValue(x, null).ObjToString() == whereValue.ObjToString()).ToList();
- var setObject = item.GetType().GetProperty(objName);
- if (setObject.PropertyType.FullName.IsCollectionsList())
- {
- setObject.SetValue(item, setValue.ToList(), null);
- }
- else
- {
- setObject.SetValue(item, setValue.FirstOrDefault(), null);
- }
- }
- };
- Mappers.Add(mapper);
- }
- else
- {
- Action<List<T>> mapper = (entitys) =>
- {
- if (entitys.IsNullOrEmpty() || !entitys.Any()) return;
- var entity = entitys.First();
- var tEntity = this.Context.EntityMaintenance.GetEntityInfo<T>();
- var whereCol = tEntity.Columns.FirstOrDefault(it => it.PropertyName.Equals(filedName, StringComparison.CurrentCultureIgnoreCase));
- if (whereCol == null)
- {
- whereCol = tEntity.Columns.FirstOrDefault(it => it.IsPrimarykey == true);
- }
- if (whereCol == null)
- {
- whereCol = tEntity.Columns.FirstOrDefault(it => GetPrimaryKeys().Any(pk => pk.Equals(it.DbColumnName, StringComparison.CurrentCultureIgnoreCase)));
- }
- if (whereCol == null)
- {
- whereCol = tEntity.Columns.FirstOrDefault(it => it.PropertyName.Equals("id", StringComparison.CurrentCultureIgnoreCase));
- }
- if (whereCol == null)
- {
- whereCol = tEntity.Columns.FirstOrDefault(it => (it.PropertyName).Equals(it.EntityName + "id", StringComparison.CurrentCultureIgnoreCase));
- }
- if (whereCol == null)
- {
- Check.Exception(true, ".Mapper() parameter error");
- }
- List<string> inValues = entitys.Select(it => it.GetType().GetProperty(whereCol.PropertyName).GetValue(it, null).ObjToString()).ToList();
- var dbColumnName = filedEntity.Columns.FirstOrDefault(it => it.PropertyName == filedName).DbColumnName;
- List<IConditionalModel> wheres = new List<IConditionalModel>()
- {
- new ConditionalModel()
- {
- FieldName=dbColumnName,
- ConditionalType= ConditionalType.In,
- FieldValue=string.Join(",",inValues)
- }
- };
- var list = this.Context.Queryable<TObject>().Where(wheres).ToList();
- foreach (var item in entitys)
- {
- var whereValue = item.GetType().GetProperty(whereCol.PropertyName).GetValue(item, null);
- var setValue = list.Where(x => x.GetType().GetProperty(filedName).GetValue(x, null).ObjToString() == whereValue.ObjToString()).ToList();
- var setObject = item.GetType().GetProperty(objName);
- if (setObject.PropertyType.FullName.IsCollectionsList())
- {
- setObject.SetValue(item, setValue.ToList(), null);
- }
- else
- {
- setObject.SetValue(item, setValue.FirstOrDefault(), null);
- }
- }
- };
- Mappers.Add(mapper);
- }
- return this;
- }
- private ISugarQueryable<T> _Mapper<TObject>(Expression mapperObject, Expression mainField, Expression childField)
- {
- if ((mapperObject as LambdaExpression).Body is UnaryExpression)
- {
- mapperObject = ((mapperObject as LambdaExpression).Body as UnaryExpression).Operand;
- }
- else
- {
- mapperObject = (mapperObject as LambdaExpression).Body;
- }
- if ((mainField as LambdaExpression).Body is UnaryExpression)
- {
- mainField = ((mainField as LambdaExpression).Body as UnaryExpression).Operand;
- }
- else
- {
- mainField = (mainField as LambdaExpression).Body;
- }
- if ((childField as LambdaExpression).Body is UnaryExpression)
- {
- childField = ((childField as LambdaExpression).Body as UnaryExpression).Operand;
- }
- else
- {
- childField = (childField as LambdaExpression).Body;
- }
- Check.Exception(mapperObject is MemberExpression == false || mainField is MemberExpression == false, ".Mapper() parameter error");
- var mapperObjectExp = mapperObject as MemberExpression;
- var mainFieldExp = mainField as MemberExpression;
- var childFieldExp = childField as MemberExpression;
- Check.Exception(mainFieldExp.Type.IsClass(), ".Mapper() parameter error");
- Check.Exception(childFieldExp.Type.IsClass(), ".Mapper() parameter error");
- var objType = mapperObjectExp.Type;
- var filedType = mainFieldExp.Expression.Type;
- Check.Exception(objType != typeof(TObject) && objType != typeof(List<TObject>), ".Mapper() parameter error");
- if (objType == typeof(List<TObject>))
- {
- objType = typeof(TObject);
- }
- var mainFiledName = mainFieldExp.Member.Name;
- var childFiledName = childFieldExp.Member.Name;
- var objName = mapperObjectExp.Member.Name;
- var filedEntity = this.Context.EntityMaintenance.GetEntityInfo(objType);
- var objEntity = this.Context.EntityMaintenance.GetEntityInfo(filedType);
- var isSelf = filedType == typeof(T);
- if (Mappers == null)
- Mappers = new List<Action<List<T>>>();
- if (isSelf)
- {
- Action<List<T>> mapper = (entitys) =>
- {
- if (entitys.IsNullOrEmpty() || !entitys.Any()) return;
- var entity = entitys.First();
- var whereCol = filedEntity.Columns.FirstOrDefault(it => it.PropertyName.Equals(childFiledName, StringComparison.CurrentCultureIgnoreCase));
- if (whereCol == null)
- {
- whereCol = filedEntity.Columns.FirstOrDefault(it => it.IsPrimarykey == true);
- }
- if (whereCol == null)
- {
- whereCol = filedEntity.Columns.FirstOrDefault(it => GetPrimaryKeys().Any(pk => pk.Equals(it.DbColumnName, StringComparison.CurrentCultureIgnoreCase)));
- }
- if (whereCol == null)
- {
- whereCol = filedEntity.Columns.FirstOrDefault(it => it.PropertyName.Equals("id", StringComparison.CurrentCultureIgnoreCase));
- }
- if (whereCol == null)
- {
- whereCol = filedEntity.Columns.FirstOrDefault(it => (it.PropertyName).Equals(it.EntityName + "id", StringComparison.CurrentCultureIgnoreCase));
- }
- if (whereCol == null)
- {
- Check.Exception(true, ".Mapper() parameter error");
- }
- List<string> inValues = entitys.Select(it => it.GetType().GetProperty(mainFiledName).GetValue(it, null).ObjToString()).ToList();
- List<IConditionalModel> wheres = new List<IConditionalModel>()
- {
- new ConditionalModel()
- {
- FieldName=whereCol.DbColumnName,
- ConditionalType= ConditionalType.In,
- FieldValue=string.Join(",",inValues.Distinct())
- }
- };
- var list = this.Context.Queryable<TObject>().Where(wheres).ToList();
- foreach (var item in entitys)
- {
- var whereValue = item.GetType().GetProperty(mainFiledName).GetValue(item, null);
- var setValue = list.Where(x => x.GetType().GetProperty(whereCol.PropertyName).GetValue(x, null).ObjToString() == whereValue.ObjToString()).ToList();
- var setObject = item.GetType().GetProperty(objName);
- if (setObject.PropertyType.FullName.IsCollectionsList())
- {
- setObject.SetValue(item, setValue.ToList(), null);
- }
- else
- {
- setObject.SetValue(item, setValue.FirstOrDefault(), null);
- }
- }
- };
- Mappers.Add(mapper);
- }
- else
- {
- Action<List<T>> mapper = (entitys) =>
- {
- if (entitys.IsNullOrEmpty() || !entitys.Any()) return;
- var entity = entitys.First();
- var tEntity = this.Context.EntityMaintenance.GetEntityInfo<T>();
- var whereCol = tEntity.Columns.FirstOrDefault(it => it.PropertyName.Equals(childFiledName, StringComparison.CurrentCultureIgnoreCase));
- if (whereCol == null)
- {
- whereCol = tEntity.Columns.FirstOrDefault(it => it.IsPrimarykey == true);
- }
- if (whereCol == null)
- {
- whereCol = tEntity.Columns.FirstOrDefault(it => GetPrimaryKeys().Any(pk => pk.Equals(it.DbColumnName, StringComparison.CurrentCultureIgnoreCase)));
- }
- if (whereCol == null)
- {
- whereCol = tEntity.Columns.FirstOrDefault(it => it.PropertyName.Equals("id", StringComparison.CurrentCultureIgnoreCase));
- }
- if (whereCol == null)
- {
- whereCol = tEntity.Columns.FirstOrDefault(it => (it.PropertyName).Equals(it.EntityName + "id", StringComparison.CurrentCultureIgnoreCase));
- }
- if (whereCol == null)
- {
- Check.Exception(true, ".Mapper() parameter error");
- }
- List<string> inValues = entitys.Select(it => it.GetType().GetProperty(whereCol.PropertyName).GetValue(it, null).ObjToString()).ToList();
- var dbColumnName = filedEntity.Columns.FirstOrDefault(it => it.PropertyName == mainFiledName).DbColumnName;
- List<IConditionalModel> wheres = new List<IConditionalModel>()
- {
- new ConditionalModel()
- {
- FieldName=dbColumnName,
- ConditionalType= ConditionalType.In,
- FieldValue=string.Join(",",inValues)
- }
- };
- var list = this.Context.Queryable<TObject>().Where(wheres).ToList();
- foreach (var item in entitys)
- {
- var whereValue = item.GetType().GetProperty(whereCol.PropertyName).GetValue(item, null);
- var setValue = list.Where(x => x.GetType().GetProperty(mainFiledName).GetValue(x, null).ObjToString() == whereValue.ObjToString()).ToList();
- var setObject = item.GetType().GetProperty(objName);
- if (setObject.PropertyType.FullName.IsCollectionsList())
- {
- setObject.SetValue(item, setValue.ToList(), null);
- }
- else
- {
- setObject.SetValue(item, setValue.FirstOrDefault(), null);
- }
- }
- };
- Mappers.Add(mapper);
- }
- return this;
- }
- private void SetContextModel<TResult>(List<TResult> result, Type entityType)
- {
- if (result.HasValue())
- {
- if (UtilMethods.GetRootBaseType(entityType).HasValue() && UtilMethods.GetRootBaseType(entityType) == UtilConstants.ModelType)
- {
- foreach (var item in result)
- {
- var contextProperty = item.GetType().GetProperty("Context");
- SqlSugarProvider newClient = this.Context.Utilities.CopyContext();
- newClient.Ado.IsDisableMasterSlaveSeparation = true;
- if (newClient.CurrentConnectionConfig.AopEvents == null)
- newClient.CurrentConnectionConfig.AopEvents = new AopEvents();
- contextProperty.SetValue(item, newClient, null);
- }
- }
- }
- }
- #endregion
- #region Mapping Type
- protected void RestoreMapping()
- {
- if (IsAs && _RestoreMapping)
- {
- this.Context.MappingTables = OldMappingTableList == null ? new MappingTableList() : OldMappingTableList;
- }
- }
- protected void InitMapping()
- {
- if (this.QueryableMappingTableList != null)
- this.Context.MappingTables = this.QueryableMappingTableList;
- }
- #endregion
- #region Other
- private bool IsSingleWithChildTableQuery()
- {
- return this.QueryBuilder.IsSingle() && this.QueryBuilder.TableShortName.HasValue();
- }
- private Expression<Func<T, bool>> ReplaceMasterTableParameters(Expression<Func<T, bool>> expression)
- {
- var parameterName = (expression as LambdaExpression)?.Parameters?.FirstOrDefault()?.Name;
- if (parameterName != null && parameterName != this.QueryBuilder.TableShortName)
- {
- expression = ExpressionTool.ChangeLambdaExpression(expression, parameterName, this.QueryBuilder.TableShortName);
- }
- return expression;
- }
- private void orderPropertyNameByJoin(string orderPropertyName, OrderByType? orderByType)
- {
- var shortName = orderPropertyName.Split('.').FirstOrDefault();
- orderPropertyName = orderPropertyName.Split('.').Last();
- var entityType = this.QueryBuilder.JoinQueryInfos.FirstOrDefault(it => it.ShortName.EqualCase(shortName))?.EntityType;
- if (entityType == null)
- {
- entityType=this.EntityInfo.Type;
- }
- if (this.Context.EntityMaintenance.GetEntityInfoWithAttr(entityType).Columns.Any(it =>
- it.DbColumnName?.EqualCase(orderPropertyName) == true
- || it.PropertyName?.EqualCase(orderPropertyName) == true))
- {
- var name = this.Context.EntityMaintenance.GetEntityInfoWithAttr(entityType).Columns.FirstOrDefault(it =>
- it.DbColumnName?.EqualCase(orderPropertyName) == true
- || it.PropertyName?.EqualCase(orderPropertyName) == true)?.DbColumnName;
- this.OrderBy(this.SqlBuilder.GetTranslationColumnName(shortName)+"."+this.SqlBuilder.GetTranslationColumnName(name) + " " + orderByType);
- }
- else
- {
- Check.ExceptionEasy($"OrderByPropertyName error.{orderPropertyName} does not exist in the entity class", $"OrderByPropertyName出错实体类中不存在{orderPropertyName}");
- }
- }
- private void OutIntoTableSql(string TableName, out KeyValuePair<string, List<SugarParameter>> sqlInfo, out string sql,Type tableInfo)
- {
- var columnList = this.Context.EntityMaintenance.GetEntityInfo(tableInfo).Columns;
- //var entityInfo = this.Context.EntityMaintenance.GetEntityInfo(TableEntityType);
- sqlInfo = this.ToSql();
- var name = this.SqlBuilder.GetTranslationTableName(TableName);
- var columns = "";
- sql = "";
- var isSqlFunc = this.QueryBuilder.SelectValue is Expression;
- if (isSqlFunc)
- {
- columns = "(";
- foreach (var item in ExpressionTool.GetNewExpressionItemList((Expression)this.QueryBuilder.SelectValue))
- {
- var column = item.Key;
- var columnInfo = columnList.FirstOrDefault(it => it.PropertyName == item.Key);
- if (columnInfo != null)
- {
- column =this.SqlBuilder.GetTranslationColumnName(columnInfo.DbColumnName);
- }
- columns += $"{column},";
- }
- columns = columns.TrimEnd(',') + ")";
- sql = $" INSERT INTO {name} {columns} " + sqlInfo.Key;
- }
- else
- {
- //if (this.QueryBuilder.GetSelectValue != null && this.QueryBuilder.GetSelectValue.Contains(",")) ;
- //{
- columns = "(";
- foreach (var item in this.QueryBuilder.GetSelectValue.Split(','))
- {
- var column = Regex.Split(item, " AS ").Last().Trim();
- var columnInfo= columnList.FirstOrDefault(it => SqlBuilder.GetTranslationColumnName(it.PropertyName) == column);
- if (columnInfo != null)
- {
- column = SqlBuilder.GetTranslationColumnName(columnInfo.DbColumnName);
- }
- columns += $"{column},";
- }
- columns = columns.TrimEnd(',') + ")";
- //}
- sql = $" INSERT INTO {name} {columns} " + sqlInfo.Key;
- }
- }
- internal string GetTableName(EntityInfo entity, string tableName)
- {
- var oldTableName = tableName;
- var attr = entity?.Type?.GetCustomAttribute<TenantAttribute>();
- var configId = ((object)this.Context.CurrentConnectionConfig.ConfigId).ObjToString();
- if (attr != null && configId != attr.configId.ObjToString())
- {
- var dbName = this.Context.Root.GetConnection(attr.configId).Ado.Connection.Database;
- tableName = this.Context.Root.GetConnection(attr.configId).EntityMaintenance.GetEntityInfo(entity.Type).DbTableName;
- oldTableName = tableName;
- tableName = this.QueryBuilder.LambdaExpressions.DbMehtods.GetTableWithDataBase
- (this.QueryBuilder.Builder.GetTranslationColumnName(dbName), this.QueryBuilder.Builder.GetTranslationColumnName(tableName));
- }
- if (attr != null && configId != attr.configId.ObjToString())
- {
- var dbLinkName = this.Context.Root.GetConnection(attr.configId).CurrentConnectionConfig.DbLinkName;
- if (dbLinkName != null)
- {
- if (dbLinkName.First()== '@')
- {
- tableName = this.QueryBuilder.Builder.GetTranslationColumnName(oldTableName) +dbLinkName;
- }
- else if (dbLinkName.Last() == '_')
- {
- tableName = dbLinkName+oldTableName;
- }
- else
- {
- tableName = dbLinkName + "." + this.QueryBuilder.Builder.GetTranslationColumnName(oldTableName);
- }
- }
- }
- if (tableName == null)
- {
- tableName = entity.DbTableName;
- }
- return tableName;
- }
- protected string AppendSelect(List<EntityColumnInfo> entityColumnInfos,string sql, ReadOnlyCollection<ParameterExpression> parameters, List<EntityColumnInfo> columnsResult, int parameterIndex1)
- {
- //var lowerSql = sql.ToLower();
- //var isSubquery = lowerSql.Contains("select ") && ExpressionTool.IsMemberInit(this.QueryBuilder.SelectValue);
- //if (isSubquery)
- //{
- return AppendSelectWithSubQuery(entityColumnInfos, sql, parameters, columnsResult, parameterIndex1);
- //}
- //var columns = entityColumnInfos;
- //var parameterName = parameters[parameterIndex1];
- //foreach (var item in columns)
- //{
- // if (item.IsIgnore == false && columnsResult.Any(it => it.PropertyName.EqualCase(item.PropertyName)) && !lowerSql.Contains(SqlBuilder.GetTranslationColumnName(item.PropertyName.ToLower())))
- // {
- // if (item.EntityName == this.QueryBuilder.EntityName&&sql.StartsWith("*,"))
- // {
- // continue;
- // }
- // sql = $" {sql},{SqlBuilder.GetTranslationColumnName(item.DbColumnName)} AS {SqlBuilder.GetTranslationColumnName(item.PropertyName)} ";
- // }
- //}
- //return sql;
- }
- private string AppendSelectWithSubQuery(List<EntityColumnInfo> entityColumnInfos, string sql, ReadOnlyCollection<ParameterExpression> parameters, List<EntityColumnInfo> columnsResult, int parameterIndex1,string parameterName)
- {
- var list = ExpressionTool.GetMemberInit(this.QueryBuilder.SelectValue)?.Bindings?.Cast<MemberBinding>()
- ?.Select(it => it.Member.Name)?.ToList()??new List<string>();
- var columns = entityColumnInfos;
- //var parameterName = parameters[parameterIndex1];
- if (this.QueryBuilder.AutoAppendedColumns == null)
- {
- this.QueryBuilder.AutoAppendedColumns = new List<string>();
- }
- foreach (var item in columns)
- {
- if (item.IsIgnore == false && !this.QueryBuilder.AutoAppendedColumns.Contains(item.PropertyName) && columnsResult.Any(it => it.PropertyName.EqualCase(item.PropertyName)) && !list.Any(it => it.EqualCase(item.PropertyName)))
- {
- if (!sql.Contains($"{SqlBuilder.GetTranslationColumnName(parameterName)}.{SqlBuilder.GetTranslationColumnName(item.DbColumnName)} AS {SqlBuilder.GetTranslationColumnName(item.PropertyName)}")&&
- !sql.Contains($"{SqlBuilder.GetTranslationColumnName(parameterName)}.{SqlBuilder.GetTranslationColumnName(item.DbColumnName)} AS {SqlBuilder.GetTranslationColumnName(item.PropertyName)}"))
- {
- sql = $" {sql},{SqlBuilder.GetTranslationColumnName(parameterName)}.{SqlBuilder.GetTranslationColumnName(item.DbColumnName)} AS {SqlBuilder.GetTranslationColumnName(item.PropertyName)} ";
- this.QueryBuilder.AutoAppendedColumns.Add(item.PropertyName);
- }
- }
- }
- return sql;
- }
- private string AppendSelectWithSubQuery(List<EntityColumnInfo> entityColumnInfos, string sql, ReadOnlyCollection<ParameterExpression> parameters, List<EntityColumnInfo> columnsResult, int parameterIndex1)
- {
- var list = ExpressionTool.GetMemberInit(this.QueryBuilder.SelectValue).Bindings.Cast<MemberBinding>()
- .Select(it => it.Member.Name).ToList();
- var columns = entityColumnInfos;
- var parameterName = parameters[parameterIndex1];
- if (this.QueryBuilder.AutoAppendedColumns == null)
- {
- this.QueryBuilder.AutoAppendedColumns = new List<string>();
- }
- foreach (var item in columns)
- {
- if (item.IsIgnore == false &&!this.QueryBuilder.AutoAppendedColumns.Contains(item.PropertyName)&& columnsResult.Any(it => it.PropertyName.EqualCase(item.PropertyName))&& !list.Any(it=>it.EqualCase(item.PropertyName)))
- {
- if (!sql.Contains($"{SqlBuilder.GetTranslationColumnName(item.DbColumnName)} AS {SqlBuilder.GetTranslationColumnName(item.PropertyName)}")&&
- !sql.Contains($"{SqlBuilder.GetTranslationColumnName(item.DbColumnName)} AS {SqlBuilder.GetTranslationColumnName(item.PropertyName)}"))
- {
- if (parameterIndex1==0&&this.QueryBuilder.JoinQueryInfos.Any())
- {
- sql = $" {sql},{SqlBuilder.GetTranslationColumnName(this.QueryBuilder.TableShortName)}.{SqlBuilder.GetTranslationColumnName(item.DbColumnName)} AS {SqlBuilder.GetTranslationColumnName(item.PropertyName)} ";
- this.QueryBuilder.AutoAppendedColumns.Add(item.PropertyName);
- }
- else
- {
- sql = $" {sql},{SqlBuilder.GetTranslationColumnName(item.DbColumnName)} AS {SqlBuilder.GetTranslationColumnName(item.PropertyName)} ";
- this.QueryBuilder.AutoAppendedColumns.Add(item.PropertyName);
- }
- }
- }
- }
- return sql;
- }
- protected string AppendSelect<EntityType>(string sql, ReadOnlyCollection<ParameterExpression> parameters, List<EntityColumnInfo> columnsResult, int parameterIndex1)
- {
- var columns = this.Context.EntityMaintenance.GetEntityInfoWithAttr(typeof(EntityType)).Columns;
- //var lowerSql = sql.ToLower();
- //var isSubquery = lowerSql.Contains("select ") && ExpressionTool.IsMemberInit(this.QueryBuilder.SelectValue);
- //if (isSubquery)
- //{
- return AppendSelectWithSubQuery(columns, sql, parameters, columnsResult, parameterIndex1, parameters[parameterIndex1].Name);
- //}
- //var parameterName = parameters[parameterIndex1].Name;
- //if (parameterName.HasValue())
- //{
- // parameterName = this.SqlBuilder.GetTranslationColumnName(parameterName);
- //}
- //foreach (var item in columns)
- //{
- // if (item.IsIgnore == false && columnsResult.Any(it => it.PropertyName.EqualCase(item.PropertyName)) && !sql.ToLower().Contains(SqlBuilder.GetTranslationColumnName(item.PropertyName).ToLower()))
- // {
- // if (!sql.Contains($"{parameterName}.{SqlBuilder.GetTranslationColumnName(item.DbColumnName)} AS {SqlBuilder.GetTranslationColumnName(item.PropertyName)}")&&
- // !sql.Contains($"{parameterName}.{SqlBuilder.GetTranslationColumnName(item.DbColumnName)} AS {SqlBuilder.GetTranslationColumnName(item.PropertyName)}"))
- // {
- // sql = $" {sql},{parameterName}.{SqlBuilder.GetTranslationColumnName(item.DbColumnName)} AS {SqlBuilder.GetTranslationColumnName(item.PropertyName)} ";
- // }
- // }
- //}
- //return sql;
- }
- internal JoinQueryInfo GetJoinInfo(Expression joinExpression, JoinType joinType)
- {
- QueryBuilder.CheckExpressionNew(joinExpression, "Join");
- QueryBuilder.JoinExpression = joinExpression;
- var express = LambdaExpression.Lambda(joinExpression).Body;
- var lastPareamter = (express as LambdaExpression).Parameters.Last();
- var expResult = this.QueryBuilder.GetExpressionValue(joinExpression, ResolveExpressType.WhereMultiple);
- this.Context.InitMappingInfo(lastPareamter.Type);
- var result = new JoinQueryInfo()
- {
- JoinIndex = QueryBuilder.JoinQueryInfos.Count,
- JoinType = joinType,
- JoinWhere = expResult.GetResultString(),
- ShortName = lastPareamter.Name,
- EntityType= lastPareamter.Type,
- TableName = null
- };
- if (QueryBuilder.IsCrossQueryWithAttr)
- {
- result.TableName = GetTableName(this.Context.EntityMaintenance.GetEntityInfoWithAttr(lastPareamter.Type), result.TableName);
- }
- else
- {
- result.TableName= this.Context.EntityMaintenance.GetTableName(lastPareamter.Type);
- }
- if (this.Context.CurrentConnectionConfig?.MoreSettings?.PgSqlIsAutoToLower == false)
- {
- result.ShortName = this.SqlBuilder.GetTranslationColumnName(result.ShortName);
- }
- if (result.JoinIndex == 0)
- {
- var firstPareamter = (express as LambdaExpression).Parameters.First();
- this.QueryBuilder.TableShortName = firstPareamter.Name;
- if (this.QueryBuilder.AsTables != null && this.QueryBuilder.AsTables.Count == 1)
- {
- var tableinfo = this.QueryBuilder.AsTables.First();
- if (this.QueryBuilder.TableWithString != SqlWith.Null && this.Context.CurrentConnectionConfig?.MoreSettings?.IsWithNoLockQuery == true && this.QueryBuilder.AsTables.First().Value.ObjToString().Contains(SqlWith.NoLock) == false)
- {
- this.QueryBuilder.AsTables[tableinfo.Key] = " (SELECT * FROM " + this.QueryBuilder.AsTables.First().Value + $" {SqlWith.NoLock} )";
- }
- else if (this.QueryBuilder.IsSqlQuery && this.QueryBuilder.AsTables.First().Value.ObjToString().StartsWith("("))
- {
- var tableName = this.QueryBuilder.AsTables.First().Value;
- this.QueryBuilder.AsTables[tableinfo.Key] = " (SELECT * FROM " + tableName + ")" + this.QueryBuilder.TableShortName;
- }
- else
- {
- var tableName = this.QueryBuilder.AsTables.First().Value;
- if (tableName != null && Regex.IsMatch(tableName, @"^\w+$"))
- {
- tableName = SqlBuilder.GetTranslationTableName(tableName);
- }
- this.QueryBuilder.AsTables[tableinfo.Key] = " (SELECT * FROM " + tableName + ")";
- }
- this.QueryBuilder.SelectValue =this.SqlBuilder.GetTranslationColumnName(this.QueryBuilder.TableShortName) + ".*";
- }
- }
- Check.Exception(result.JoinIndex > 10, ErrorMessage.GetThrowMessage("只支持12个表", "Only 12 tables are supported"));
- return result;
- }
- protected ISugarQueryable<TResult> _Select<TResult>(Expression expression)
- {
- QueryBuilder.CheckExpression(expression, "Select");
- this.Context.InitMappingInfo(typeof(TResult));
- var result = InstanceFactory.GetQueryable<TResult>(this.Context.CurrentConnectionConfig);
- result.Context = this.Context;
- result.SqlBuilder = this.SqlBuilder;
- result.SqlBuilder.QueryBuilder.Parameters = QueryBuilder.Parameters;
- result.SqlBuilder.QueryBuilder.SelectValue = expression;
- result.SqlBuilder.QueryBuilder.IsSelectSingleFiledJson = UtilMethods.IsJsonMember(expression, this.Context);
- result.SqlBuilder.QueryBuilder.IsSelectSingleFiledArray = UtilMethods.IsArrayMember(expression, this.Context);
- if (this.IsCache)
- {
- result.WithCache(this.CacheTime);
- }
- if (this.QueryBuilder.IsSqlQuery)
- {
- this.QueryBuilder.IsSqlQuerySelect = true;
- }
- return result;
- }
- protected void _Where(Expression expression)
- {
- QueryBuilder.CheckExpression(expression, "Where");
- var isSingle = QueryBuilder.IsSingle();
- var result = QueryBuilder.GetExpressionValue(expression, isSingle ? ResolveExpressType.WhereSingle : ResolveExpressType.WhereMultiple);
- QueryBuilder.WhereInfos.Add(SqlBuilder.AppendWhereOrAnd(QueryBuilder.WhereInfos.IsNullOrEmpty(), result.GetResultString()));
- }
- protected ISugarQueryable<T> _OrderBy(Expression expression, OrderByType type = OrderByType.Asc)
- {
- QueryBuilder.CheckExpression(expression, "OrderBy");
- var isSingle = QueryBuilder.IsSingle();
- var member= ExpressionTool.RemoveConvert(ExpressionTool.GetLambdaExpressionBody(expression)) is MemberExpression;
- if (member==false&&expression.ToString().IsContainsIn("Desc(", "Asc("))
- {
- var orderValue = "";
- var newExp = (expression as LambdaExpression).Body as NewExpression;
- if (newExp == null)
- {
- orderValue = QueryBuilder.GetExpressionValue(expression, isSingle ? ResolveExpressType.FieldSingle : ResolveExpressType.FieldMultiple).GetResultString();
- return OrderBy(orderValue);
- }
- foreach (var item in newExp.Arguments)
- {
- if (item is MemberExpression)
- {
- orderValue +=
- QueryBuilder.GetExpressionValue(item, isSingle ? ResolveExpressType.FieldSingle : ResolveExpressType.FieldMultiple).GetResultString() + ",";
- }
- else
- {
- orderValue +=
- QueryBuilder.GetExpressionValue(item, isSingle ? ResolveExpressType.WhereSingle : ResolveExpressType.WhereMultiple).GetResultString() + ",";
- }
- }
- orderValue = orderValue.TrimEnd(',');
- OrderBy(orderValue);
- return this;
- }
- else if ((expression as LambdaExpression).Body is NewExpression)
- {
- var newExp = (expression as LambdaExpression).Body as NewExpression;
- var result = "";
- foreach (var item in newExp.Arguments)
- {
- if (item is MemberExpression&&type==OrderByType.Asc)
- {
- result +=
- QueryBuilder.GetExpressionValue(item, isSingle ? ResolveExpressType.FieldSingle : ResolveExpressType.FieldMultiple).GetResultString() + ",";
- }
- else if (item is MemberExpression && type == OrderByType.Desc)
- {
- result +=
- QueryBuilder.GetExpressionValue(item, isSingle ? ResolveExpressType.FieldSingle : ResolveExpressType.FieldMultiple).GetResultString() + " Desc,";
- }
- else if (type == OrderByType.Desc)
- {
- result +=
- QueryBuilder.GetExpressionValue(item, isSingle ? ResolveExpressType.WhereSingle : ResolveExpressType.WhereMultiple).GetResultString() + " Desc ,";
- }
- else
- {
- result +=
- QueryBuilder.GetExpressionValue(item, isSingle ? ResolveExpressType.WhereSingle : ResolveExpressType.WhereMultiple).GetResultString() + ",";
- }
- }
- result = result.TrimEnd(',');
- OrderBy(result);
- return this;
- }
- else
- {
- var lamResult = QueryBuilder.GetExpressionValue(expression, isSingle ? ResolveExpressType.FieldSingle : ResolveExpressType.FieldMultiple);
- OrderBy(lamResult.GetResultString() + UtilConstants.Space + type.ToString().ToUpper());
- return this;
- }
- }
- private void _ToOffsetPage(int pageIndex, int pageSize)
- {
- QueryBuilder.Offset = $" OFFSET {(pageIndex - 1) * pageSize} ROWS FETCH NEXT {pageSize} ROWS ONLY";
- }
- private int _PageList(int pageIndex, int pageSize)
- {
- if (pageIndex == 0)
- pageIndex = 1;
- if (QueryBuilder.PartitionByValue.HasValue())
- {
- QueryBuilder.ExternalPageIndex = pageIndex;
- QueryBuilder.ExternalPageSize = pageSize;
- }
- else
- {
- QueryBuilder.Skip = (pageIndex - 1) * pageSize;
- QueryBuilder.Take = pageSize;
- }
- return pageIndex;
- }
- protected ISugarQueryable<T> _GroupBy(Expression expression)
- {
- QueryBuilder.CheckExpression(expression, "GroupBy");
- LambdaExpression lambda = expression as LambdaExpression;
- expression = lambda.Body;
- var isSingle = QueryBuilder.IsSingle();
- ExpressionResult lamResult = null;
- string result = null;
- if (expression is NewExpression)
- {
- var newExp = expression as NewExpression;
- foreach (var item in newExp.Arguments)
- {
- if (item is MemberExpression)
- {
- result +=
- QueryBuilder.GetExpressionValue(item, isSingle ? ResolveExpressType.FieldSingle : ResolveExpressType.FieldMultiple).GetResultString() + ",";
- }
- else
- {
- result +=
- QueryBuilder.GetExpressionValue(item, isSingle ? ResolveExpressType.WhereSingle : ResolveExpressType.WhereMultiple).GetResultString() + ",";
- }
- }
- result = result.TrimEnd(',');
- }
- else
- {
- expression=ExpressionTool.RemoveConvert(expression);
- lamResult = QueryBuilder.GetExpressionValue(expression, isSingle ? ResolveExpressType.FieldSingle : ResolveExpressType.FieldMultiple);
- result = lamResult.GetResultString();
- }
- GroupBy(result);
- return this;
- }
- protected ISugarQueryable<T> _As(string tableName, string entityName)
- {
- if (this.QueryBuilder.AsTables != null && this.QueryBuilder.AsTables.Any(it => it.Key == entityName))
- {
- if (this.QueryBuilder.JoinQueryInfos.Count(it => it.TableName.EqualCase(tableName)) > 1)
- {
- Check.ExceptionEasy($"if same entity name ,.LeftJoin(db.Queryable<{entityName}>,(x,y..)=>....).As(\"{tableName}\")",$"存在相同实体,请使用.LeftJoin(db.Queryable<{entityName}>).As(\"{tableName}\",(x,y..)=>...)");
- }
- Check.Exception(true, ErrorMessage.GetThrowMessage($"use As<{tableName}>(\"{tableName}\")", $"请把 As(\"{tableName}\"), 改成 As<{tableName}实体>(\"{tableName}\")"));
- }
- else
- {
- this.QueryBuilder.AsTables.Add(entityName, tableName);
- }
- return this;
- }
- protected void _Filter(string FilterName, bool isDisabledGobalFilter)
- {
- QueryBuilder.IsDisabledGobalFilter = isDisabledGobalFilter;
- if (this.Context.QueryFilter.GeFilterList.HasValue() && FilterName.HasValue())
- {
- var list = this.Context.QueryFilter.GeFilterList.Where(it => it.FilterName == FilterName && it.IsJoinQuery == !QueryBuilder.IsSingle());
- foreach (var item in list)
- {
- var filterResult = item.FilterValue(this.Context);
- Where(filterResult.Sql + UtilConstants.Space, filterResult.Parameters);
- }
- }
- }
- public ISugarQueryable<T> _PartitionBy(Expression expression)
- {
- QueryBuilder.CheckExpression(expression, "PartitionBy");
- LambdaExpression lambda = expression as LambdaExpression;
- expression = lambda.Body;
- var isSingle = QueryBuilder.IsSingle();
- ExpressionResult lamResult = null;
- string result = null;
- if (expression is NewExpression)
- {
- lamResult = QueryBuilder.GetExpressionValue(expression, isSingle ? ResolveExpressType.ArraySingle : ResolveExpressType.ArrayMultiple);
- result = string.Join(",", lamResult.GetResultArray());
- }
- else
- {
- lamResult = QueryBuilder.GetExpressionValue(expression, isSingle ? ResolveExpressType.FieldSingle : ResolveExpressType.FieldMultiple);
- result = lamResult.GetResultString();
- }
- PartitionBy(result);
- return this;
- }
- protected ISugarQueryable<T> _Having(Expression expression)
- {
- QueryBuilder.CheckExpression(expression, "Having");
- var isSingle = QueryBuilder.IsSingle();
- var lamResult = QueryBuilder.GetExpressionValue(expression, isSingle ? ResolveExpressType.WhereSingle : ResolveExpressType.WhereMultiple);
- Having(lamResult.GetResultString());
- return this;
- }
- protected List<TResult> _ToList<TResult>()
- {
- List<TResult> result = null;
- var sqlObj = this._ToSql();
- if (IsCache)
- {
- var cacheService = this.Context.CurrentConnectionConfig.ConfigureExternalServices.DataInfoCacheService;
- result = CacheSchemeMain.GetOrCreate<List<TResult>>(cacheService, this.QueryBuilder, () => { return GetData<TResult>(sqlObj); }, CacheTime, this.Context, CacheKey);
- }
- else
- {
- result = GetData<TResult>(sqlObj);
- }
- RestoreMapping();
- _InitNavigat(result);
- _SubQuery(result);
- _Mapper(result);
- return result;
- }
- protected async Task<List<TResult>> _ToListAsync<TResult>()
- {
- List<TResult> result = null;
- var sqlObj = this._ToSql();
- if (IsCache)
- {
- var cacheService = this.Context.CurrentConnectionConfig.ConfigureExternalServices.DataInfoCacheService;
- result = CacheSchemeMain.GetOrCreate<List<TResult>>(cacheService, this.QueryBuilder, () => { return GetData<TResult>(sqlObj); }, CacheTime, this.Context, CacheKey);
- }
- else
- {
- result = await GetDataAsync<TResult>(sqlObj);
- }
- RestoreMapping();
- await _InitNavigatAsync(result);
- await _SubQueryAsync(result);
- _Mapper(result);
- return result;
- }
- private void ToSqlBefore()
- {
- var moreSetts = this.Context.CurrentConnectionConfig.MoreSettings;
- if (moreSetts != null && moreSetts.IsWithNoLockQuery && string.IsNullOrEmpty(QueryBuilder.TableWithString))
- {
- this.With(SqlWith.NoLock);
- }
- }
- protected List<TResult> GetData<TResult>(KeyValuePair<string, List<SugarParameter>> sqlObj)
- {
- List<TResult> result;
- var isComplexModel = QueryBuilder.IsComplexModel(sqlObj.Key);
- var entityType = typeof(TResult);
- bool isChangeQueryableSlave = GetIsSlaveQuery();
- bool isChangeQueryableMasterSlave = GetIsMasterQuery();
- var dataReader = this.Db.GetDataReader(sqlObj.Key, sqlObj.Value.ToArray());
- result = GetData<TResult>(isComplexModel, entityType, dataReader);
- RestChangeMasterQuery(isChangeQueryableMasterSlave);
- RestChangeSlaveQuery(isChangeQueryableSlave);
- return result;
- }
- protected async Task<List<TResult>> GetDataAsync<TResult>(KeyValuePair<string, List<SugarParameter>> sqlObj)
- {
- List<TResult> result;
- var isComplexModel = QueryBuilder.IsComplexModel(sqlObj.Key);
- var entityType = typeof(TResult);
- bool isChangeQueryableSlave = GetIsSlaveQuery();
- bool isChangeQueryableMasterSlave = GetIsMasterQuery();
- var dataReader = await this.Db.GetDataReaderAsync(sqlObj.Key, sqlObj.Value.ToArray());
- result = await GetDataAsync<TResult>(isComplexModel, entityType, dataReader);
- RestChangeMasterQuery(isChangeQueryableMasterSlave);
- RestChangeSlaveQuery(isChangeQueryableSlave);
- return result;
- }
- private List<TResult> GetData<TResult>(bool isComplexModel, Type entityType, IDataReader dataReader)
- {
- List<TResult> result;
- this.Bind.QueryBuilder = this.QueryBuilder;
- this.Context.Utilities.QueryBuilder = this.QueryBuilder;
- if (entityType == UtilConstants.DynamicType)
- {
- result = this.Context.Utilities.DataReaderToExpandoObjectList(dataReader) as List<TResult>;
- }
- else if (entityType.Name?.StartsWith("ValueTuple`")==true)
- {
- result = Db.Context.Utilities.DataReaderToValueTupleType<TResult>(dataReader);
- }
- else if (entityType == UtilConstants.ObjType)
- {
- result = this.Context.Utilities.DataReaderToExpandoObjectList(dataReader).Select(it => ((TResult)(object)it)).ToList();
- }
- else if (QueryBuilder.IsSelectSingleFiledJson)
- {
- result = this.Context.Utilities.DataReaderToSelectJsonList<TResult>(dataReader);
- }
- else if (QueryBuilder.IsSelectSingleFiledArray)
- {
- result = this.Context.Utilities.DataReaderToSelectArrayList<TResult>(dataReader);
- }
- else if (entityType.IsAnonymousType() || isComplexModel|| StaticConfig.EnableAot)
- {
- if (entityType.IsClass() == false && StaticConfig.EnableAot)
- {
- result = this.Bind.DataReaderToList<TResult>(entityType, dataReader);
- }
- else
- {
- result = this.Context.Utilities.DataReaderToList<TResult>(dataReader);
- }
- }
- else
- {
- result = this.Bind.DataReaderToList<TResult>(entityType, dataReader);
- }
- SetContextModel(result, entityType);
- return result;
- }
- private async Task<List<TResult>> GetDataAsync<TResult>(bool isComplexModel, Type entityType, IDataReader dataReader)
- {
- List<TResult> result;
- this.Bind.QueryBuilder = this.QueryBuilder;
- this.Context.Utilities.QueryBuilder = this.QueryBuilder;
- if (entityType == UtilConstants.DynamicType)
- {
- result = await this.Context.Utilities.DataReaderToExpandoObjectListAsync(dataReader) as List<TResult>;
- }
- else if (entityType.Name?.StartsWith("ValueTuple`") == true)
- {
- result =await Db.Context.Utilities.DataReaderToValueTupleTypeAsync<TResult>(dataReader);
- }
- else if (entityType == UtilConstants.ObjType)
- {
- var expObj = await this.Context.Utilities.DataReaderToExpandoObjectListAsync(dataReader);
- result = expObj.Select(it => ((TResult)(object)it)).ToList();
- }
- else if (QueryBuilder.IsSelectSingleFiledJson)
- {
- result = await this.Context.Utilities.DataReaderToSelectJsonListAsync<TResult>(dataReader);
- }
- else if (QueryBuilder.IsSelectSingleFiledArray)
- {
- result =await this.Context.Utilities.DataReaderToSelectArrayListAsync<TResult>(dataReader);
- }
- else if (entityType.IsAnonymousType() || isComplexModel||StaticConfig.EnableAot)
- {
- if (entityType.IsClass() == false && StaticConfig.EnableAot)
- {
- result =await this.Bind.DataReaderToListAsync<TResult>(entityType, dataReader);
- }
- else
- {
- result = await this.Context.Utilities.DataReaderToListAsync<TResult>(dataReader);
- }
- }
- else
- {
- result = await this.Bind.DataReaderToListAsync<TResult>(entityType, dataReader);
- }
- SetContextModel(result, entityType);
- return result;
- }
- protected void _InQueryable(Expression expression, KeyValuePair<string, List<SugarParameter>> sqlObj)
- {
- QueryBuilder.CheckExpression(expression, "In");
- string sql = sqlObj.Key;
- if (sqlObj.Value.HasValue())
- {
- this.SqlBuilder.RepairReplicationParameters(ref sql, sqlObj.Value.ToArray(), 100);
- this.QueryBuilder.Parameters.AddRange(sqlObj.Value);
- }
- var isSingle = QueryBuilder.IsSingle();
- var lamResult = QueryBuilder.GetExpressionValue(expression, isSingle ? ResolveExpressType.FieldSingle : ResolveExpressType.FieldMultiple);
- var fieldName = lamResult.GetResultString();
- var whereSql = string.Format(this.QueryBuilder.InTemplate, fieldName, sql);
- this.QueryBuilder.WhereInfos.Add(SqlBuilder.AppendWhereOrAnd(this.QueryBuilder.WhereInfos.IsNullOrEmpty(), whereSql));
- base._InQueryableIndex += 100;
- }
- protected List<string> GetPrimaryKeys()
- {
- if (this.Context.IsSystemTablesConfig)
- {
- return this.Context.DbMaintenance.GetPrimaries(this.Context.EntityMaintenance.GetTableName(this.EntityInfo.EntityName));
- }
- else
- {
- return this.EntityInfo.Columns.Where(it => it.IsPrimarykey).Select(it => it.DbColumnName).ToList();
- }
- }
- protected virtual List<string> GetIdentityKeys()
- {
- if (this.Context.IsSystemTablesConfig)
- {
- return this.Context.DbMaintenance.GetIsIdentities(this.EntityInfo.DbTableName);
- }
- else
- {
- return this.EntityInfo.Columns.Where(it => it.IsIdentity).Select(it => it.DbColumnName).ToList();
- }
- }
- protected void CopyQueryBuilder(QueryBuilder asyncQueryableBuilder)
- {
- var pars = new List<SugarParameter>();
- if (this.QueryBuilder.Parameters != null)
- {
- pars = this.QueryBuilder.Parameters.Select(it => new SugarParameter(it.ParameterName, it.Value)
- {
- DbType = it.DbType,
- Value = it.Value,
- ParameterName = it.ParameterName,
- Direction = it.Direction,
- IsArray = it.IsArray,
- IsJson = it.IsJson,
- IsNullable = it.IsNullable,
- IsRefCursor = it.IsRefCursor,
- Size = it.Size,
- SourceColumn = it.SourceColumn,
- SourceColumnNullMapping = it.SourceColumnNullMapping,
- SourceVersion = it.SourceVersion,
- TempDate = it.TempDate,
- TypeName = it.TypeName,
- UdtTypeName = it.UdtTypeName,
- IsNvarchar2=it.IsNvarchar2,
- _Size = it._Size
- }).ToList();
- }
- asyncQueryableBuilder.IsEnableMasterSlaveSeparation = this.QueryBuilder.IsEnableMasterSlaveSeparation;
- asyncQueryableBuilder.TranLock = this.QueryBuilder.TranLock;
- asyncQueryableBuilder.IsDisableMasterSlaveSeparation = this.QueryBuilder.IsDisableMasterSlaveSeparation;
- asyncQueryableBuilder.IsQueryInQuery = this.QueryBuilder.IsQueryInQuery;
- asyncQueryableBuilder.Includes = this.QueryBuilder.Includes;
- asyncQueryableBuilder.Take = this.QueryBuilder.Take;
- asyncQueryableBuilder.Skip = this.QueryBuilder.Skip;
- asyncQueryableBuilder.SelectValue = this.QueryBuilder.SelectValue;
- asyncQueryableBuilder.WhereInfos = this.Context.Utilities.TranslateCopy(this.QueryBuilder.WhereInfos);
- asyncQueryableBuilder.EasyJoinInfos = this.Context.Utilities.TranslateCopy(this.QueryBuilder.EasyJoinInfos);
- asyncQueryableBuilder.JoinQueryInfos = QueryBuilder.JoinQueryInfos.Select(it => CopyJoinInfo(it)).ToList();
- asyncQueryableBuilder.WhereIndex = this.QueryBuilder.WhereIndex;
- asyncQueryableBuilder.EntityType = this.QueryBuilder.EntityType;
- asyncQueryableBuilder.EntityName = this.QueryBuilder.EntityName;
- asyncQueryableBuilder.Parameters = pars;
- asyncQueryableBuilder.TableShortName = this.QueryBuilder.TableShortName;
- asyncQueryableBuilder.TableWithString = this.QueryBuilder.TableWithString;
- asyncQueryableBuilder.GroupByValue = this.QueryBuilder.GroupByValue;
- asyncQueryableBuilder.IsDistinct = this.QueryBuilder.IsDistinct;
- asyncQueryableBuilder.OrderByValue = this.QueryBuilder.OrderByValue;
- asyncQueryableBuilder.IsDisabledGobalFilter = this.QueryBuilder.IsDisabledGobalFilter;
- asyncQueryableBuilder.PartitionByValue = this.QueryBuilder.PartitionByValue;
- asyncQueryableBuilder.JoinExpression = this.QueryBuilder.JoinExpression;
- asyncQueryableBuilder.WhereIndex = this.QueryBuilder.WhereIndex;
- asyncQueryableBuilder.HavingInfos = this.QueryBuilder.HavingInfos;
- asyncQueryableBuilder.LambdaExpressions.ParameterIndex = this.QueryBuilder.LambdaExpressions.ParameterIndex;
- asyncQueryableBuilder.IgnoreColumns = this.Context.Utilities.TranslateCopy(this.QueryBuilder.IgnoreColumns);
- asyncQueryableBuilder.AsTables = this.Context.Utilities.TranslateCopy(this.QueryBuilder.AsTables);
- asyncQueryableBuilder.DisableTop = this.QueryBuilder.DisableTop;
- asyncQueryableBuilder.Offset = this.QueryBuilder.Offset;
- asyncQueryableBuilder.IsSqlQuery = this.QueryBuilder.IsSqlQuery;
- asyncQueryableBuilder.IsSqlQuerySelect = this.QueryBuilder.IsSqlQuerySelect;
- asyncQueryableBuilder.OldSql = this.QueryBuilder.OldSql;
- asyncQueryableBuilder.IsCrossQueryWithAttr = this.QueryBuilder.IsCrossQueryWithAttr;
- asyncQueryableBuilder.CrossQueryItems = this.QueryBuilder.CrossQueryItems;
- asyncQueryableBuilder.SubToListParameters = this.Context.Utilities.TranslateCopy(this.QueryBuilder.SubToListParameters);
- asyncQueryableBuilder.AppendColumns = this.Context.Utilities.TranslateCopy(this.QueryBuilder.AppendColumns);
- asyncQueryableBuilder.AppendValues = this.Context.Utilities.TranslateCopy(this.QueryBuilder.AppendValues);
- asyncQueryableBuilder.RemoveFilters = this.QueryBuilder.RemoveFilters?.ToArray();
- asyncQueryableBuilder.Hints = this.QueryBuilder.Hints;
- if (this.QueryBuilder.AppendNavInfo != null)
- {
- asyncQueryableBuilder.AppendNavInfo = new AppendNavInfo()
- {
- AppendProperties= this.QueryBuilder.AppendNavInfo.AppendProperties.ToDictionary(it => it.Key, it => it.Value),
- MappingNavProperties= this.QueryBuilder.AppendNavInfo.MappingNavProperties.ToDictionary(it=>it.Key,it=>it.Value)
- } ;
- }
- }
- private static JoinQueryInfo CopyJoinInfo(JoinQueryInfo it)
- {
- return new JoinQueryInfo()
- {
- EntityType = it.EntityType,
- JoinIndex = it.JoinIndex,
- JoinType = it.JoinType,
- JoinWhere = it.JoinWhere,
- ShortName = it.ShortName,
- TableName = it.TableName
- };
- }
- protected int SetCacheTime(int cacheDurationInSeconds)
- {
- if (cacheDurationInSeconds == int.MaxValue && this.Context.CurrentConnectionConfig.MoreSettings != null && this.Context.CurrentConnectionConfig.MoreSettings.DefaultCacheDurationInSeconds > 0)
- {
- cacheDurationInSeconds = this.Context.CurrentConnectionConfig.MoreSettings.DefaultCacheDurationInSeconds;
- }
- return cacheDurationInSeconds;
- }
- public virtual KeyValuePair<string, List<SugarParameter>> _ToSql()
- {
- InitMapping();
- ToSqlBefore();
- string sql = QueryBuilder.ToSqlString();
- RestoreMapping();
- return new KeyValuePair<string, List<SugarParameter>>(sql, QueryBuilder.Parameters);
- }
- #endregion
- #region Subquery
- private bool IsSubToList()
- {
- return this.QueryBuilder.SubToListParameters != null && this.QueryBuilder.SubToListParameters.Count > 0;
- }
- public virtual ISugarQueryable<T> MergeTableWithSubToListJoin()
- {
- //_ToSql();
- var clone = this.Clone();
- clone.QueryBuilder.AppendValues = null;
- clone.QueryBuilder.SubToListParameters = null;
- clone.QueryBuilder.AppendColumns = null;
- Check.Exception(this.MapperAction != null || this.MapperActionWithCache != null, ErrorMessage.GetThrowMessage("'Mapper’ needs to be written after ‘MergeTable’ ", "Mapper 只能在 MergeTable 之后使用"));
- //Check.Exception(this.QueryBuilder.SelectValue.IsNullOrEmpty(),ErrorMessage.GetThrowMessage( "MergeTable need to use Queryable.Select Method .", "使用MergeTable之前必须要有Queryable.Select方法"));
- //Check.Exception(this.QueryBuilder.Skip > 0 || this.QueryBuilder.Take > 0 || this.QueryBuilder.OrderByValue.HasValue(),ErrorMessage.GetThrowMessage( "MergeTable Queryable cannot Take Skip OrderBy PageToList ", "使用 MergeTable不能有 Take Skip OrderBy PageToList 等操作,你可以在Mergetable之后操作"));
- var sqlobj = clone.ToSql();
- var index = QueryBuilder.WhereIndex + 1;
- var result = this.Context.Queryable<T>().AS(SqlBuilder.GetPackTable(sqlobj.Key, "MergeTable")).AddParameters(sqlobj.Value).Select("*").With(SqlWith.Null);
- result.QueryBuilder.WhereIndex = index;
- result.QueryBuilder.LambdaExpressions.ParameterIndex = QueryBuilder.LambdaExpressions.ParameterIndex++;
- result.QueryBuilder.LambdaExpressions.Index = QueryBuilder.LambdaExpressions.Index++;
- if (this.Context.CurrentConnectionConfig.DbType == DbType.Oracle)
- {
- result.Select("MergeTable.*");
- }
- result.QueryBuilder.AppendValues = this.QueryBuilder.AppendValues;
- result.QueryBuilder.SubToListParameters = this.QueryBuilder.SubToListParameters;
- result.QueryBuilder.AppendColumns = this.QueryBuilder.AppendColumns;
- return result;
- }
- public virtual ISugarQueryable<T> MergeTableWithSubToList()
- {
- _ToSql();
- var clone = this.Clone();
- clone.QueryBuilder.AppendValues = null;
- clone.QueryBuilder.SubToListParameters = null;
- clone.QueryBuilder.AppendColumns = null;
- Check.Exception(this.MapperAction != null || this.MapperActionWithCache != null, ErrorMessage.GetThrowMessage("'Mapper’ needs to be written after ‘MergeTable’ ", "Mapper 只能在 MergeTable 之后使用"));
- //Check.Exception(this.QueryBuilder.SelectValue.IsNullOrEmpty(),ErrorMessage.GetThrowMessage( "MergeTable need to use Queryable.Select Method .", "使用MergeTable之前必须要有Queryable.Select方法"));
- //Check.Exception(this.QueryBuilder.Skip > 0 || this.QueryBuilder.Take > 0 || this.QueryBuilder.OrderByValue.HasValue(),ErrorMessage.GetThrowMessage( "MergeTable Queryable cannot Take Skip OrderBy PageToList ", "使用 MergeTable不能有 Take Skip OrderBy PageToList 等操作,你可以在Mergetable之后操作"));
- var sqlobj = clone.ToSql();
- var index = QueryBuilder.WhereIndex + 1;
- var result = this.Context.Queryable<T>().AS(SqlBuilder.GetPackTable(sqlobj.Key, "MergeTable")).AddParameters(sqlobj.Value).Select("*").With(SqlWith.Null);
- result.QueryBuilder.WhereIndex = index;
- result.QueryBuilder.LambdaExpressions.ParameterIndex = QueryBuilder.LambdaExpressions.ParameterIndex++;
- result.QueryBuilder.LambdaExpressions.Index = QueryBuilder.LambdaExpressions.Index++;
- if (this.Context.CurrentConnectionConfig.DbType == DbType.Oracle)
- {
- result.Select("MergeTable.*");
- }
- result.QueryBuilder.AppendValues = this.QueryBuilder.AppendValues;
- result.QueryBuilder.SubToListParameters = this.QueryBuilder.SubToListParameters;
- result.QueryBuilder.AppendColumns = this.QueryBuilder.AppendColumns;
- return result;
- }
- private void _SubQuery<TResult>(List<TResult> result)
- {
- if (result == null || result.Count == 0)
- {
- return;
- }
- var isSubToList = this.QueryBuilder.SubToListParameters != null && this.QueryBuilder.SubToListParameters.Any();
- if (!isSubToList)
- {
- return;
- }
- var appendValues = this.QueryBuilder.AppendValues;
- var subParamters = this.QueryBuilder.SubToListParameters;
- foreach (var subPara in subParamters)
- {
- if (appendValues != null)
- AppendSubWhereToList(result, appendValues, subPara);
- else
- AppendSubToList(result, appendValues, subPara);
- }
- }
- private void AppendSubToList<TResult>(List<TResult> result, List<List<QueryableAppendColumn>> appendValues, KeyValuePair<string, object> subPara)
- {
- var ps = this.QueryBuilder.Parameters;
- var itemProperty = typeof(TResult).GetProperty(subPara.Key);
- var callType = itemProperty.PropertyType.GetGenericArguments().FirstOrDefault();
- var isFirst = false;
- if (callType == null)
- {
- callType = itemProperty.PropertyType;
- isFirst = true;
- }
- var sql = subPara.Value.ObjToString().Replace("@sugarIndex", "0");
- sql =SqlBuilder.RemoveParentheses(sql);
- var methodParamters = new object[] { sql, ps };
- var subList = ExpressionBuilderHelper.CallFunc(callType, methodParamters, this.Clone(), "SubQueryList");
- for (var i = 0; i < result.Count; i++)
- {
- var item = result[i];
- var setValue = Activator.CreateInstance(itemProperty.PropertyType, true) as IList;
- if (typeof(TResult).IsAnonymousType())
- {
- if (isFirst)
- {
- var jobj = JObject.FromObject(item);
- var prop = jobj.Property(itemProperty.Name);
- prop.Value = JObject.FromObject((subList as IList).Cast<object>().FirstOrDefault());
- result[i] = jobj.ToObject<TResult>();
- }
- else
- {
- var jobj = JObject.FromObject(item);
- var prop = jobj.Property(itemProperty.Name);
- prop.Value = JArray.FromObject(subList);
- result[i] = jobj.ToObject<TResult>();
- }
- }
- else
- {
- if (isFirst)
- {
- if ((subList as IList).Count > 0)
- {
- itemProperty.SetValue(item, (subList as IList)[0]);
- }
- }
- else
- {
- itemProperty.SetValue(item, subList);
- }
- }
- }
- }
- private void AppendSubWhereToList<TResult>(List<TResult> result, List<List<QueryableAppendColumn>> appendValues, KeyValuePair<string, object> subPara)
- {
- var ps = this.QueryBuilder.Parameters;
- var index = 0;
- List<string> sqls = new List<string>();
- foreach (var item in result)
- {
- var sql = subPara.Value.ObjToString();
- var replaceValues = appendValues[index];
- foreach (var re in replaceValues)
- {
- var config = this.Context.CurrentConnectionConfig;
- var p = new SugarParameter[] {
- new SugarParameter("@p",re.Value)
- };
- var value = UtilMethods.GetSqlString(config.DbType, "@p", p, true);
- sql = sql.Replace(re.Name, value);
-
- }
- sql = SqlBuilder.RemoveParentheses(sql);
- sql = sql.Replace("@sugarIndex", index + "");
- sqls.Add(sql);
- index++;
- }
- var itemProperty = typeof(TResult).GetProperty(subPara.Key);
- var callType = itemProperty.PropertyType.GetGenericArguments().FirstOrDefault();
- var isFirst = false;
- if (callType == null)
- {
- callType = itemProperty.PropertyType;
- isFirst = true;
- }
- var sqlstring = string.Join(" \r\n UNION ALL ", sqls);
- if (callType?.IsClass() == false)
- {
- Regex regex = new Regex(@"\,\d{1,10} as sugarIndex");
- sqlstring = regex.Replace(sqlstring, it=> (" as id " + it.Value));
- callType = typeof(SubQueryToListDefaultT);
- }
- var methodParamters = new object[] { sqlstring, ps.ToArray() };
- this.QueryBuilder.SubToListParameters = null;
- this.QueryBuilder.AppendColumns = new List<QueryableAppendColumn>() {
- new QueryableAppendColumn(){ Name="sugarIndex",AsName="sugarIndex" }
- };
- this.QueryBuilder.AppendValues = null;
- var subList = ExpressionBuilderHelper.CallFunc(callType, methodParamters, this.Clone(), "SubQueryList");
- var appendValue = this.QueryBuilder.AppendValues;
- var list = (subList as IEnumerable).Cast<object>().ToList();
- if (isFirst && !typeof(TResult).IsAnonymousType())
- {
- SetSubListWithClassFirst(result, itemProperty, appendValue, list, 0);
- }
- else if (isFirst && typeof(TResult).IsAnonymousType())
- {
- SetSubListWithAnonymousTypeFirst(result, itemProperty, appendValue, list, 0);
- }
- else if (typeof(TResult).IsAnonymousType())
- {
- SetSubListWithAnonymousType(result, itemProperty, appendValue, list, 0);
- }
- else
- {
- SetSubListWithClass(result, itemProperty, appendValue, list, 0);
- }
- }
- private static int SetSubListWithAnonymousType<TResult>(List<TResult> result, PropertyInfo itemProperty, List<List<QueryableAppendColumn>> appendValue, List<object> list, int resIndex)
- {
- for (int i = 0; i < result.Count; i++)
- {
- var item = result[i];
- var setValue = Activator.CreateInstance(itemProperty.PropertyType, true) as IList;
- if (appendValue != null)
- {
- var appindex = 0;
- foreach (var appValue in appendValue)
- {
- if (appValue[0].Value.ObjToInt() == i)
- {
- var addItem = list[appindex];
- if (addItem is SubQueryToListDefaultT)
- {
- addItem = (addItem as SubQueryToListDefaultT).id;
- }
- setValue.Add(addItem);
- }
- appindex++;
- }
- }
- var jobj = JObject.FromObject(item);
- var prop = jobj.Property(itemProperty.Name);
- prop.Value = JArray.FromObject(setValue);
- result[i] = jobj.ToObject<TResult>();
- //itemProperty.SetValue(item, setValue);
- }
- return resIndex;
- }
- private static int SetSubListWithAnonymousTypeFirst<TResult>(List<TResult> result, PropertyInfo itemProperty, List<List<QueryableAppendColumn>> appendValue, List<object> list, int resIndex)
- {
- for (int i = 0; i < result.Count; i++)
- {
- var item = result[i];
- object setValue = null;
- if (appendValue != null)
- {
- var appindex = 0;
- foreach (var appValue in appendValue)
- {
- if (appValue[0].Value.ObjToInt() == i)
- {
- setValue = list[appindex];
- //setValue.Add(addItem);
- }
- appindex++;
- }
- }
- var jobj = JObject.FromObject(item);
- var prop = jobj.Property(itemProperty.Name);
- if (setValue != null)
- {
- prop.Value = JObject.FromObject(setValue);
- }
- result[i] = jobj.ToObject<TResult>();
- //itemProperty.SetValue(item, setValue);
- }
- return resIndex;
- }
- private static int SetSubListWithClassFirst<TResult>(List<TResult> result, PropertyInfo itemProperty, List<List<QueryableAppendColumn>> appendValue, List<object> list, int resIndex)
- {
- foreach (var item in result)
- {
- //var setValue = Activator.CreateInstance(itemProperty.PropertyType, true);
- if (appendValue != null)
- {
- var appindex = 0;
- foreach (var appValue in appendValue)
- {
- if (appValue[0].Value.ObjToInt() == resIndex)
- {
- var addItem = list[appindex];
- itemProperty.SetValue(item, addItem);
- }
- appindex++;
- }
- }
- //itemProperty.SetValue(item, setValue);
- resIndex++;
- }
- return resIndex;
- }
- private static int SetSubListWithClass<TResult>(List<TResult> result, PropertyInfo itemProperty, List<List<QueryableAppendColumn>> appendValue, List<object> list, int resIndex)
- {
- foreach (var item in result)
- {
- var setValue = Activator.CreateInstance(itemProperty.PropertyType, true) as IList;
- if (appendValue != null)
- {
- var appindex = 0;
- foreach (var appValue in appendValue)
- {
- if (appValue[0].Value.ObjToInt() == resIndex)
- {
- var addItem = list[appindex];
- if (addItem is SubQueryToListDefaultT)
- {
- addItem= ((SubQueryToListDefaultT)addItem).id;
- }
- if (addItem!=null&&addItem is string && itemProperty?.PropertyType?.GenericTypeArguments?.FirstOrDefault() == UtilConstants.GuidType)
- {
- addItem = Guid.Parse(addItem+"");
- }
- setValue.Add(addItem);
- }
- appindex++;
- }
- }
- itemProperty.SetValue(item, setValue);
- resIndex++;
- }
- return resIndex;
- }
- private async Task _SubQueryAsync<TResult>(List<TResult> result)
- {
- var isSubToList = this.QueryBuilder.SubToListParameters != null && this.QueryBuilder.SubToListParameters.Any();
- if (!isSubToList)
- {
- return;
- }
- await Task.Run(() =>{_SubQuery(result);});
- }
- public List<Type> SubQueryList<Type>(string sql,object parameters)
- {
- return this.Context.Ado.SqlQuery<Type>(sql,parameters);
- }
- #endregion
- #region Bool
- private bool MasterHasWhereFirstJoin()
- {
- if (this.QueryBuilder.IsSingle() == false && this.QueryBuilder.SelectValue is LambdaExpression exp &&this.QueryBuilder.AsTables?.Any()==false)
- {
- if (exp.Parameters.Count == this.QueryBuilder.JoinQueryInfos.Count+1)
- {
- return true;
- }
- }
- return this.QueryBuilder.JoinIndex == 0 &&
- this.QueryBuilder.IsSqlQuery == false &&
- !this.QueryBuilder.AsTables.Any() &&
- this.QueryBuilder.IsSingle() &&
- (this.QueryBuilder.WhereInfos.Any()|| this.QueryBuilder.SelectValue is Expression);
- }
- #endregion
- }
- }
|