mirror of
https://gitee.com/dotnetchina/SqlSugar.git
synced 2025-12-02 03:13:58 +08:00
Synchronization code
This commit is contained in:
@@ -149,6 +149,17 @@ namespace SqlSugar
|
||||
}
|
||||
QueryBuilder.AppendValues.Add(addItems);
|
||||
}
|
||||
if (QueryBuilder?.AppendNavInfo != null)
|
||||
{
|
||||
var navResult = new AppendNavResult();
|
||||
foreach (var item in QueryBuilder?.AppendNavInfo.AppendProperties)
|
||||
{
|
||||
var vi = dataReader.GetOrdinal("SugarNav_" + item.Key);
|
||||
var value = dataReader.GetValue(vi);
|
||||
navResult.result.Add("SugarNav_"+item.Key,value);
|
||||
}
|
||||
QueryBuilder?.AppendNavInfo.Result.Add(navResult);
|
||||
}
|
||||
}
|
||||
|
||||
private List<string> GetDataReaderNames(IDataReader dataReader,ref string types)
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq.Expressions;
|
||||
using System.Text;
|
||||
|
||||
namespace SqlSugar
|
||||
{
|
||||
internal class AppendNavInfo
|
||||
{
|
||||
public Dictionary<string, MappingNavColumnInfo> MappingNavProperties { get; set; }= new Dictionary<string, MappingNavColumnInfo>();
|
||||
public Dictionary<string, string> AppendProperties { get; set; }= new Dictionary<string, string>();
|
||||
public List<AppendNavResult> Result { get; set; } =new List<AppendNavResult>();
|
||||
}
|
||||
internal class AppendNavResult
|
||||
{
|
||||
public Dictionary<string, object> result = new Dictionary<string, object>();
|
||||
}
|
||||
internal class MappingNavColumnInfo
|
||||
{
|
||||
public List<Expression> ExpressionList { get; set; }
|
||||
public string Name { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -556,6 +556,81 @@ namespace SqlSugar
|
||||
#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 = 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 navName = ExpressionTool.GetMemberName(item.Expressions.First());
|
||||
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 == name1);
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private async Task _InitNavigatAsync<TResult>(List<TResult> result)
|
||||
{
|
||||
if (this.QueryBuilder.Includes != null)
|
||||
@@ -568,18 +643,119 @@ namespace SqlSugar
|
||||
if (this.QueryBuilder.Includes != null)
|
||||
{
|
||||
var managers = (this.QueryBuilder.Includes as List<object>);
|
||||
if (this.QueryBuilder.SelectValue.HasValue() && this.QueryBuilder.NoCheckInclude == false)
|
||||
if (IsSelectNavQuery())
|
||||
{
|
||||
Check.ExceptionEasy("To use includes, use select after tolist()", "使用Includes请在ToList()之后在使用Select");
|
||||
if (result.HasValue())
|
||||
{
|
||||
SelectNavQuery(result, managers);
|
||||
}
|
||||
}
|
||||
foreach (var it in managers)
|
||||
else
|
||||
{
|
||||
var manager = it as NavigatManager<TResult>;
|
||||
manager.RootList = result;
|
||||
manager.Execute();
|
||||
foreach (var it in managers)
|
||||
{
|
||||
var manager = it as NavigatManager<TResult>;
|
||||
manager.RootList = result;
|
||||
manager.Execute();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void SelectNavQuery<TResult>(List<TResult> result, List<object> managers)
|
||||
{
|
||||
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(it=> this.QueryBuilder.AppendNavInfo.Result.First().result.ContainsKey("SugarNav_" + it.PropertyName))
|
||||
.ToList();
|
||||
var listType = typeof(List<>).MakeGenericType(tType);
|
||||
var outList=SelectNavQuery_SetList(result, it, p, tType, columns, listType);
|
||||
it.GetType().GetMethod("Execute").Invoke(it, null);
|
||||
SelectNavQuery_MappingList(it,result, outList, allColumns.Where(it=>it.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(it => it.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;
|
||||
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))
|
||||
@@ -1578,6 +1754,14 @@ namespace SqlSugar
|
||||
asyncQueryableBuilder.AppendColumns = this.Context.Utilities.TranslateCopy(this.QueryBuilder.AppendColumns);
|
||||
asyncQueryableBuilder.AppendValues = this.Context.Utilities.TranslateCopy(this.QueryBuilder.AppendValues);
|
||||
asyncQueryableBuilder.RemoveFilters = this.QueryBuilder.RemoveFilters?.ToArray();
|
||||
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)
|
||||
|
||||
@@ -1114,12 +1114,18 @@ namespace SqlSugar
|
||||
}
|
||||
public virtual ISugarQueryable<TResult> Select<TResult>(Expression expression)
|
||||
{
|
||||
Check.ExceptionEasy(this.QueryBuilder.Includes.HasValue(), $"use Includes(...).ToList(it=>new {typeof(TResult).Name} {{...}} )", $"Includes()后面禁使用Select,正确写法: ToList(it=>new {typeof(TResult).Name}{{....}})");
|
||||
if (IsAppendNavColumns())
|
||||
{
|
||||
SetAppendNavColumns(expression);
|
||||
}
|
||||
return _Select<TResult>(expression);
|
||||
}
|
||||
public virtual ISugarQueryable<TResult> Select<TResult>(Expression<Func<T, TResult>> expression)
|
||||
{
|
||||
Check.ExceptionEasy(this.QueryBuilder.Includes.HasValue(), $"use Includes(...).ToList(it=>new {typeof(TResult).Name} {{...}} )", $"Includes()后面禁使用Select,正确写法: ToList(it=>new {typeof(TResult).Name}{{....}})");
|
||||
if (IsAppendNavColumns())
|
||||
{
|
||||
SetAppendNavColumns(expression);
|
||||
}
|
||||
return _Select<TResult>(expression);
|
||||
}
|
||||
public ISugarQueryable<TResult> Select<TResult>(Expression<Func<T, TResult>> expression, bool isAutoFill)
|
||||
|
||||
@@ -229,6 +229,10 @@ namespace SqlSugar
|
||||
#region Select
|
||||
public ISugarQueryable<TResult> Select<TResult>(Expression<Func<T, T2, TResult>> expression)
|
||||
{
|
||||
if (IsAppendNavColumns())
|
||||
{
|
||||
SetAppendNavColumns(expression);
|
||||
}
|
||||
return _Select<TResult>(expression);
|
||||
}
|
||||
public ISugarQueryable<TResult> Select<TResult>(Expression<Func<T,T2, TResult>> expression, bool isAutoFill)
|
||||
@@ -946,11 +950,19 @@ namespace SqlSugar
|
||||
|
||||
public ISugarQueryable<TResult> Select<TResult>(Expression<Func<T, T2, T3, TResult>> expression)
|
||||
{
|
||||
if (IsAppendNavColumns())
|
||||
{
|
||||
SetAppendNavColumns(expression);
|
||||
}
|
||||
return _Select<TResult>(expression);
|
||||
}
|
||||
|
||||
public ISugarQueryable<TResult> Select<TResult>(Expression<Func<T, T2, TResult>> expression)
|
||||
{
|
||||
if (IsAppendNavColumns())
|
||||
{
|
||||
SetAppendNavColumns(expression);
|
||||
}
|
||||
return _Select<TResult>(expression);
|
||||
}
|
||||
|
||||
@@ -1531,14 +1543,26 @@ namespace SqlSugar
|
||||
|
||||
public ISugarQueryable<TResult> Select<TResult>(Expression<Func<T, T2, TResult>> expression)
|
||||
{
|
||||
if (IsAppendNavColumns())
|
||||
{
|
||||
SetAppendNavColumns(expression);
|
||||
}
|
||||
return _Select<TResult>(expression);
|
||||
}
|
||||
public ISugarQueryable<TResult> Select<TResult>(Expression<Func<T, T2, T3, TResult>> expression)
|
||||
{
|
||||
if (IsAppendNavColumns())
|
||||
{
|
||||
SetAppendNavColumns(expression);
|
||||
}
|
||||
return _Select<TResult>(expression);
|
||||
}
|
||||
public ISugarQueryable<TResult> Select<TResult>(Expression<Func<T, T2, T3, T4, TResult>> expression)
|
||||
{
|
||||
if (IsAppendNavColumns())
|
||||
{
|
||||
SetAppendNavColumns(expression);
|
||||
}
|
||||
return _Select<TResult>(expression);
|
||||
}
|
||||
#endregion
|
||||
@@ -2251,18 +2275,34 @@ namespace SqlSugar
|
||||
|
||||
public ISugarQueryable<TResult> Select<TResult>(Expression<Func<T, T2, TResult>> expression)
|
||||
{
|
||||
if (IsAppendNavColumns())
|
||||
{
|
||||
SetAppendNavColumns(expression);
|
||||
}
|
||||
return _Select<TResult>(expression);
|
||||
}
|
||||
public ISugarQueryable<TResult> Select<TResult>(Expression<Func<T, T2, T3, TResult>> expression)
|
||||
{
|
||||
if (IsAppendNavColumns())
|
||||
{
|
||||
SetAppendNavColumns(expression);
|
||||
}
|
||||
return _Select<TResult>(expression);
|
||||
}
|
||||
public ISugarQueryable<TResult> Select<TResult>(Expression<Func<T, T2, T3, T4, TResult>> expression)
|
||||
{
|
||||
if (IsAppendNavColumns())
|
||||
{
|
||||
SetAppendNavColumns(expression);
|
||||
}
|
||||
return _Select<TResult>(expression);
|
||||
}
|
||||
public ISugarQueryable<TResult> Select<TResult>(Expression<Func<T, T2, T3, T4, T5, TResult>> expression)
|
||||
{
|
||||
if (IsAppendNavColumns())
|
||||
{
|
||||
SetAppendNavColumns(expression);
|
||||
}
|
||||
return _Select<TResult>(expression);
|
||||
}
|
||||
#endregion
|
||||
|
||||
@@ -263,22 +263,42 @@ namespace SqlSugar
|
||||
#region Select
|
||||
public ISugarQueryable<TResult> Select<TResult>(Expression<Func<T, T2, TResult>> expression)
|
||||
{
|
||||
if (IsAppendNavColumns())
|
||||
{
|
||||
SetAppendNavColumns(expression);
|
||||
}
|
||||
return _Select<TResult>(expression);
|
||||
}
|
||||
public ISugarQueryable<TResult> Select<TResult>(Expression<Func<T, T2, T3, TResult>> expression)
|
||||
{
|
||||
if (IsAppendNavColumns())
|
||||
{
|
||||
SetAppendNavColumns(expression);
|
||||
}
|
||||
return _Select<TResult>(expression);
|
||||
}
|
||||
public ISugarQueryable<TResult> Select<TResult>(Expression<Func<T, T2, T3, T4, TResult>> expression)
|
||||
{
|
||||
if (IsAppendNavColumns())
|
||||
{
|
||||
SetAppendNavColumns(expression);
|
||||
}
|
||||
return _Select<TResult>(expression);
|
||||
}
|
||||
public ISugarQueryable<TResult> Select<TResult>(Expression<Func<T, T2, T3, T4, T5, TResult>> expression)
|
||||
{
|
||||
if (IsAppendNavColumns())
|
||||
{
|
||||
SetAppendNavColumns(expression);
|
||||
}
|
||||
return _Select<TResult>(expression);
|
||||
}
|
||||
public ISugarQueryable<TResult> Select<TResult>(Expression<Func<T, T2, T3, T4, T5, T6, TResult>> expression)
|
||||
{
|
||||
if (IsAppendNavColumns())
|
||||
{
|
||||
SetAppendNavColumns(expression);
|
||||
}
|
||||
return _Select<TResult>(expression);
|
||||
}
|
||||
public ISugarQueryable<TResult> Select<TResult>(Expression<Func<T, T2, T3, T4, T5,T6, TResult>> expression, bool isAutoFill)
|
||||
@@ -954,26 +974,50 @@ namespace SqlSugar
|
||||
#region Select
|
||||
public ISugarQueryable<TResult> Select<TResult>(Expression<Func<T, T2, TResult>> expression)
|
||||
{
|
||||
if (IsAppendNavColumns())
|
||||
{
|
||||
SetAppendNavColumns(expression);
|
||||
}
|
||||
return _Select<TResult>(expression);
|
||||
}
|
||||
public ISugarQueryable<TResult> Select<TResult>(Expression<Func<T, T2, T3, TResult>> expression)
|
||||
{
|
||||
if (IsAppendNavColumns())
|
||||
{
|
||||
SetAppendNavColumns(expression);
|
||||
}
|
||||
return _Select<TResult>(expression);
|
||||
}
|
||||
public ISugarQueryable<TResult> Select<TResult>(Expression<Func<T, T2, T3, T4, TResult>> expression)
|
||||
{
|
||||
if (IsAppendNavColumns())
|
||||
{
|
||||
SetAppendNavColumns(expression);
|
||||
}
|
||||
return _Select<TResult>(expression);
|
||||
}
|
||||
public ISugarQueryable<TResult> Select<TResult>(Expression<Func<T, T2, T3, T4, T5, TResult>> expression)
|
||||
{
|
||||
if (IsAppendNavColumns())
|
||||
{
|
||||
SetAppendNavColumns(expression);
|
||||
}
|
||||
return _Select<TResult>(expression);
|
||||
}
|
||||
public ISugarQueryable<TResult> Select<TResult>(Expression<Func<T, T2, T3, T4, T5, T6, TResult>> expression)
|
||||
{
|
||||
if (IsAppendNavColumns())
|
||||
{
|
||||
SetAppendNavColumns(expression);
|
||||
}
|
||||
return _Select<TResult>(expression);
|
||||
}
|
||||
public ISugarQueryable<TResult> Select<TResult>(Expression<Func<T, T2, T3, T4, T5, T6, T7, TResult>> expression)
|
||||
{
|
||||
if (IsAppendNavColumns())
|
||||
{
|
||||
SetAppendNavColumns(expression);
|
||||
}
|
||||
return _Select<TResult>(expression);
|
||||
}
|
||||
public ISugarQueryable<TResult> Select<TResult>(Expression<Func<T, T2, T3, T4, T5, T6,T7, TResult>> expression, bool isAutoFill)
|
||||
@@ -1612,30 +1656,58 @@ namespace SqlSugar
|
||||
#region Select
|
||||
public ISugarQueryable<TResult> Select<TResult>(Expression<Func<T, T2, TResult>> expression)
|
||||
{
|
||||
if (IsAppendNavColumns())
|
||||
{
|
||||
SetAppendNavColumns(expression);
|
||||
}
|
||||
return _Select<TResult>(expression);
|
||||
}
|
||||
public ISugarQueryable<TResult> Select<TResult>(Expression<Func<T, T2, T3, TResult>> expression)
|
||||
{
|
||||
if (IsAppendNavColumns())
|
||||
{
|
||||
SetAppendNavColumns(expression);
|
||||
}
|
||||
return _Select<TResult>(expression);
|
||||
}
|
||||
public ISugarQueryable<TResult> Select<TResult>(Expression<Func<T, T2, T3, T4, TResult>> expression)
|
||||
{
|
||||
if (IsAppendNavColumns())
|
||||
{
|
||||
SetAppendNavColumns(expression);
|
||||
}
|
||||
return _Select<TResult>(expression);
|
||||
}
|
||||
public ISugarQueryable<TResult> Select<TResult>(Expression<Func<T, T2, T3, T4, T5, TResult>> expression)
|
||||
{
|
||||
if (IsAppendNavColumns())
|
||||
{
|
||||
SetAppendNavColumns(expression);
|
||||
}
|
||||
return _Select<TResult>(expression);
|
||||
}
|
||||
public ISugarQueryable<TResult> Select<TResult>(Expression<Func<T, T2, T3, T4, T5, T6, TResult>> expression)
|
||||
{
|
||||
if (IsAppendNavColumns())
|
||||
{
|
||||
SetAppendNavColumns(expression);
|
||||
}
|
||||
return _Select<TResult>(expression);
|
||||
}
|
||||
public ISugarQueryable<TResult> Select<TResult>(Expression<Func<T, T2, T3, T4, T5, T6, T7, TResult>> expression)
|
||||
{
|
||||
if (IsAppendNavColumns())
|
||||
{
|
||||
SetAppendNavColumns(expression);
|
||||
}
|
||||
return _Select<TResult>(expression);
|
||||
}
|
||||
public ISugarQueryable<TResult> Select<TResult>(Expression<Func<T, T2, T3, T4, T5, T6, T7, T8, TResult>> expression)
|
||||
{
|
||||
if (IsAppendNavColumns())
|
||||
{
|
||||
SetAppendNavColumns(expression);
|
||||
}
|
||||
return _Select<TResult>(expression);
|
||||
}
|
||||
public ISugarQueryable<TResult> Select<TResult>(Expression<Func<T, T2, T3, T4, T5, T6, T7,T8, TResult>> expression, bool isAutoFill)
|
||||
@@ -2265,34 +2337,66 @@ namespace SqlSugar
|
||||
|
||||
public ISugarQueryable<TResult> Select<TResult>(Expression<Func<T, T2, TResult>> expression)
|
||||
{
|
||||
if (IsAppendNavColumns())
|
||||
{
|
||||
SetAppendNavColumns(expression);
|
||||
}
|
||||
return _Select<TResult>(expression);
|
||||
}
|
||||
public ISugarQueryable<TResult> Select<TResult>(Expression<Func<T, T2, T3, TResult>> expression)
|
||||
{
|
||||
if (IsAppendNavColumns())
|
||||
{
|
||||
SetAppendNavColumns(expression);
|
||||
}
|
||||
return _Select<TResult>(expression);
|
||||
}
|
||||
public ISugarQueryable<TResult> Select<TResult>(Expression<Func<T, T2, T3, T4, TResult>> expression)
|
||||
{
|
||||
if (IsAppendNavColumns())
|
||||
{
|
||||
SetAppendNavColumns(expression);
|
||||
}
|
||||
return _Select<TResult>(expression);
|
||||
}
|
||||
public ISugarQueryable<TResult> Select<TResult>(Expression<Func<T, T2, T3, T4, T5, TResult>> expression)
|
||||
{
|
||||
if (IsAppendNavColumns())
|
||||
{
|
||||
SetAppendNavColumns(expression);
|
||||
}
|
||||
return _Select<TResult>(expression);
|
||||
}
|
||||
public ISugarQueryable<TResult> Select<TResult>(Expression<Func<T, T2, T3, T4, T5, T6, TResult>> expression)
|
||||
{
|
||||
if (IsAppendNavColumns())
|
||||
{
|
||||
SetAppendNavColumns(expression);
|
||||
}
|
||||
return _Select<TResult>(expression);
|
||||
}
|
||||
public ISugarQueryable<TResult> Select<TResult>(Expression<Func<T, T2, T3, T4, T5, T6, T7, TResult>> expression)
|
||||
{
|
||||
if (IsAppendNavColumns())
|
||||
{
|
||||
SetAppendNavColumns(expression);
|
||||
}
|
||||
return _Select<TResult>(expression);
|
||||
}
|
||||
public ISugarQueryable<TResult> Select<TResult>(Expression<Func<T, T2, T3, T4, T5, T6, T7, T8, TResult>> expression)
|
||||
{
|
||||
if (IsAppendNavColumns())
|
||||
{
|
||||
SetAppendNavColumns(expression);
|
||||
}
|
||||
return _Select<TResult>(expression);
|
||||
}
|
||||
public ISugarQueryable<TResult> Select<TResult>(Expression<Func<T, T2, T3, T4, T5, T6, T7, T8, T9, TResult>> expression)
|
||||
{
|
||||
if (IsAppendNavColumns())
|
||||
{
|
||||
SetAppendNavColumns(expression);
|
||||
}
|
||||
return _Select<TResult>(expression);
|
||||
}
|
||||
#endregion
|
||||
@@ -2911,38 +3015,74 @@ namespace SqlSugar
|
||||
|
||||
public ISugarQueryable<TResult> Select<TResult>(Expression<Func<T, T2, TResult>> expression)
|
||||
{
|
||||
if (IsAppendNavColumns())
|
||||
{
|
||||
SetAppendNavColumns(expression);
|
||||
}
|
||||
return _Select<TResult>(expression);
|
||||
}
|
||||
public ISugarQueryable<TResult> Select<TResult>(Expression<Func<T, T2, T3, TResult>> expression)
|
||||
{
|
||||
if (IsAppendNavColumns())
|
||||
{
|
||||
SetAppendNavColumns(expression);
|
||||
}
|
||||
return _Select<TResult>(expression);
|
||||
}
|
||||
public ISugarQueryable<TResult> Select<TResult>(Expression<Func<T, T2, T3, T4, TResult>> expression)
|
||||
{
|
||||
if (IsAppendNavColumns())
|
||||
{
|
||||
SetAppendNavColumns(expression);
|
||||
}
|
||||
return _Select<TResult>(expression);
|
||||
}
|
||||
public ISugarQueryable<TResult> Select<TResult>(Expression<Func<T, T2, T3, T4, T5, TResult>> expression)
|
||||
{
|
||||
if (IsAppendNavColumns())
|
||||
{
|
||||
SetAppendNavColumns(expression);
|
||||
}
|
||||
return _Select<TResult>(expression);
|
||||
}
|
||||
public ISugarQueryable<TResult> Select<TResult>(Expression<Func<T, T2, T3, T4, T5, T6, TResult>> expression)
|
||||
{
|
||||
if (IsAppendNavColumns())
|
||||
{
|
||||
SetAppendNavColumns(expression);
|
||||
}
|
||||
return _Select<TResult>(expression);
|
||||
}
|
||||
public ISugarQueryable<TResult> Select<TResult>(Expression<Func<T, T2, T3, T4, T5, T6, T7, TResult>> expression)
|
||||
{
|
||||
if (IsAppendNavColumns())
|
||||
{
|
||||
SetAppendNavColumns(expression);
|
||||
}
|
||||
return _Select<TResult>(expression);
|
||||
}
|
||||
public ISugarQueryable<TResult> Select<TResult>(Expression<Func<T, T2, T3, T4, T5, T6, T7, T8, TResult>> expression)
|
||||
{
|
||||
if (IsAppendNavColumns())
|
||||
{
|
||||
SetAppendNavColumns(expression);
|
||||
}
|
||||
return _Select<TResult>(expression);
|
||||
}
|
||||
public ISugarQueryable<TResult> Select<TResult>(Expression<Func<T, T2, T3, T4, T5, T6, T7, T8, T9, TResult>> expression)
|
||||
{
|
||||
if (IsAppendNavColumns())
|
||||
{
|
||||
SetAppendNavColumns(expression);
|
||||
}
|
||||
return _Select<TResult>(expression);
|
||||
}
|
||||
public ISugarQueryable<TResult> Select<TResult>(Expression<Func<T, T2, T3, T4, T5, T6, T7, T8, T9, T10, TResult>> expression)
|
||||
{
|
||||
if (IsAppendNavColumns())
|
||||
{
|
||||
SetAppendNavColumns(expression);
|
||||
}
|
||||
return _Select<TResult>(expression);
|
||||
}
|
||||
#endregion
|
||||
|
||||
@@ -336,7 +336,10 @@ namespace SqlSugar
|
||||
{
|
||||
List<IConditionalModel> conditList = new List<IConditionalModel>();
|
||||
SetConditList(itemList, whereColumns, conditList);
|
||||
var addItem = this.Context.Queryable<T>().AS(asname).Where(conditList).ToList();
|
||||
var addItem = this.Context.Queryable<T>().AS(asname)
|
||||
.Filter(null, this.isDisableFilters)
|
||||
.TranLock(this.lockType)
|
||||
.Where(conditList).ToList();
|
||||
this.dbDataList.AddRange(addItem);
|
||||
});
|
||||
}
|
||||
|
||||
@@ -34,6 +34,7 @@ namespace SqlSugar
|
||||
#endregion
|
||||
|
||||
#region Splicing basic
|
||||
internal AppendNavInfo AppendNavInfo { get; set; }
|
||||
public Type[] RemoveFilters { get; set; }
|
||||
public Dictionary<string, object> SubToListParameters { get; set; }
|
||||
internal List<QueryableAppendColumn> AppendColumns { get; set; }
|
||||
@@ -801,10 +802,24 @@ namespace SqlSugar
|
||||
{
|
||||
result= GetExpressionValue(expression, this.SelectType).GetResultString();
|
||||
}
|
||||
if (result == null)
|
||||
if (result == null&& this.AppendNavInfo?.AppendProperties==null)
|
||||
{
|
||||
return "*";
|
||||
}
|
||||
if (this.AppendNavInfo?.AppendProperties?.Any() ==true)
|
||||
{
|
||||
if (result == null)
|
||||
{
|
||||
result = "*";
|
||||
}
|
||||
result += ",";
|
||||
var shortName = "";
|
||||
if (this.TableShortName.HasValue())
|
||||
{
|
||||
shortName = $"{Builder.GetTranslationColumnName(this.TableShortName)}.";
|
||||
}
|
||||
result += string.Join(",",this.AppendNavInfo.AppendProperties.Select(it=> shortName+Builder.GetTranslationColumnName(it.Value)+ " AS SugarNav_" + it.Key));
|
||||
}
|
||||
if (result.Contains("/**/*"))
|
||||
{
|
||||
return result.Replace("/**/*", "");
|
||||
@@ -973,7 +988,7 @@ namespace SqlSugar
|
||||
public bool NoCheckInclude { get; set; }
|
||||
public virtual bool IsSelectNoAll { get; set; } = false;
|
||||
public List<string> AutoAppendedColumns { get; set; }
|
||||
public Dictionary<string, string> MappingKeys { get; set; }
|
||||
public Dictionary<string, string> MappingKeys { get; set; }
|
||||
#endregion
|
||||
|
||||
private string GetTableName(string entityName)
|
||||
|
||||
@@ -9,6 +9,26 @@ namespace SqlSugar
|
||||
{
|
||||
public class ExpressionTool
|
||||
{
|
||||
public static Dictionary<string, Expression> GetNewExpressionItemList(Expression lamExp)
|
||||
{
|
||||
var caseExp = GetLambdaExpressionBody(lamExp);
|
||||
if (caseExp is MemberInitExpression)
|
||||
{
|
||||
return GetMemberBindingItemList((caseExp as MemberInitExpression).Bindings);
|
||||
}
|
||||
var exp= caseExp as NewExpression;
|
||||
var dict = new Dictionary<string, Expression>();
|
||||
|
||||
for (int i = 0; i < exp.Arguments.Count; i++)
|
||||
{
|
||||
var arg = exp.Arguments[i];
|
||||
var parameterInfo = exp.Constructor.GetParameters()[i];
|
||||
|
||||
dict.Add(parameterInfo.Name, arg);
|
||||
}
|
||||
|
||||
return dict;
|
||||
}
|
||||
public static Dictionary<string, Expression> GetMemberBindingItemList(ReadOnlyCollection<MemberBinding> exp)
|
||||
{
|
||||
Dictionary<string, Expression> dict = new Dictionary<string, Expression>();
|
||||
@@ -38,6 +58,12 @@ namespace SqlSugar
|
||||
ps.Visit(expr);
|
||||
return ps.Parameters.Count==0;
|
||||
}
|
||||
public static List<ParameterExpression> GetParameters(Expression expr)
|
||||
{
|
||||
var ps = new ParameterExpressionVisitor();
|
||||
ps.Visit(expr);
|
||||
return ps.Parameters;
|
||||
}
|
||||
public static bool IsComparisonOperatorBool(BinaryExpression binaryExp)
|
||||
{
|
||||
return binaryExp.NodeType.IsIn(ExpressionType.Equal,
|
||||
|
||||
@@ -44,5 +44,47 @@ namespace SqlSugar
|
||||
|
||||
return base.VisitMethodCall(node);
|
||||
}
|
||||
}
|
||||
|
||||
internal class ExpressionTreeVisitor : ExpressionVisitor
|
||||
{
|
||||
private readonly List<Expression> _nodes = new List<Expression>();
|
||||
//protected override Expression VisitBinary(BinaryExpression node)
|
||||
//{
|
||||
// // 解析二元操作符表达式
|
||||
// _nodes.Add(node);
|
||||
// Visit(node.Left);
|
||||
// Visit(node.Right);
|
||||
// return node;
|
||||
//}
|
||||
//protected override Expression VisitConstant(ConstantExpression node)
|
||||
//{
|
||||
// // 解析常量表达式
|
||||
// _nodes.Add(node);
|
||||
// return node;
|
||||
//}
|
||||
protected override Expression VisitMember(MemberExpression node)
|
||||
{
|
||||
// 解析成员访问表达式
|
||||
_nodes.Add(node);
|
||||
return node;
|
||||
}
|
||||
protected override Expression VisitMethodCall(MethodCallExpression node)
|
||||
{
|
||||
// 解析方法调用表达式
|
||||
_nodes.Add(node);
|
||||
if (node.Arguments.Any())
|
||||
{
|
||||
Visit(node.Arguments.First());
|
||||
}
|
||||
return node;
|
||||
}
|
||||
public List<Expression> GetExpressions(Expression expression)
|
||||
{
|
||||
Visit(expression);
|
||||
_nodes.Reverse();
|
||||
return _nodes;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -277,7 +277,7 @@ namespace SqlSugar
|
||||
selector = GetNewExpressionValue(rightExpression.Arguments[0]);
|
||||
}
|
||||
var selectorExp = rightExpression.Arguments[0];
|
||||
if (selector.Contains(".") && selectorExp is LambdaExpression)
|
||||
if (hasMethodCallWithName==false&&selector.Contains(".") && selectorExp is LambdaExpression)
|
||||
{
|
||||
var selectorExpLam = (selectorExp as LambdaExpression);
|
||||
var name=(selectorExpLam.Parameters[0] as ParameterExpression).Name;
|
||||
|
||||
@@ -311,6 +311,10 @@ namespace SqlSugar
|
||||
}
|
||||
MemberAssignment memberAssignment = (MemberAssignment)binding;
|
||||
var memberName = memberAssignment.Member.Name;
|
||||
if (this.Context?.SugarContext?.QueryBuilder?.AppendNavInfo?.MappingNavProperties?.ContainsKey(memberName) == true)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
var item = memberAssignment.Expression;
|
||||
if (item.Type.IsClass()&& item is MemberExpression &&(item as MemberExpression).Expression is ParameterExpression)
|
||||
{
|
||||
|
||||
@@ -146,6 +146,11 @@ namespace SqlSugar
|
||||
foreach (var item in expression.Arguments)
|
||||
{
|
||||
string memberName = expression.Members[i].Name;
|
||||
if (this.Context?.SugarContext?.QueryBuilder?.AppendNavInfo?.MappingNavProperties?.ContainsKey(memberName) == true)
|
||||
{
|
||||
++i;
|
||||
continue;
|
||||
}
|
||||
++i;
|
||||
ResolveNewExpressions(parameter, item, memberName);
|
||||
}
|
||||
|
||||
@@ -474,6 +474,17 @@ namespace SqlSugar
|
||||
}
|
||||
QueryBuilder.AppendValues.Add(addItems);
|
||||
}
|
||||
if (QueryBuilder?.AppendNavInfo != null)
|
||||
{
|
||||
var navResult = new AppendNavResult();
|
||||
foreach (var item in QueryBuilder?.AppendNavInfo.AppendProperties)
|
||||
{
|
||||
var vi = dataReader.GetOrdinal("SugarNav_" + item.Key);
|
||||
var value = dataReader.GetValue(vi);
|
||||
navResult.result.Add("SugarNav_" + item.Key, value);
|
||||
}
|
||||
QueryBuilder?.AppendNavInfo.Result.Add(navResult);
|
||||
}
|
||||
}
|
||||
private static bool IsBytes(Dictionary<string, object> readerValues, PropertyInfo item)
|
||||
{
|
||||
|
||||
@@ -122,6 +122,7 @@
|
||||
<Compile Include="Abstract\FilterProvider\FilterProvider.cs" />
|
||||
<Compile Include="Abstract\InsertableProvider\InsertableHelper.cs" />
|
||||
<Compile Include="Abstract\InsertableProvider\InsertMethodInfo.cs" />
|
||||
<Compile Include="Abstract\QueryableProvider\Entities\AppendNavInfoList.cs" />
|
||||
<Compile Include="Abstract\QueryableProvider\Entities\QueryableAppendColumn.cs" />
|
||||
<Compile Include="Abstract\QueryableProvider\Entities\SqlInfo.cs" />
|
||||
<Compile Include="Abstract\QueryableProvider\Entities\SubQueryToListDefaultT.cs" />
|
||||
|
||||
@@ -17,6 +17,28 @@ namespace SqlSugar
|
||||
{
|
||||
public class UtilMethods
|
||||
{
|
||||
public static object SetAnonymousObjectPropertyValue(object obj, string propertyName, object propertyValue)
|
||||
{
|
||||
if (obj.GetType().IsAnonymousType()) // 判断是否为匿名对象
|
||||
{
|
||||
var objType = obj.GetType();
|
||||
var objFields = objType.GetFields(BindingFlags.Instance | BindingFlags.NonPublic);
|
||||
foreach (var field in objFields) // 遍历字段列表,查找需要修改的属性
|
||||
{
|
||||
if (field.Name == $"<{propertyName}>i__Field")
|
||||
{
|
||||
field.SetValue(obj, propertyValue); // 使用反射修改属性值
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
obj.GetType().GetProperty(propertyName).SetValue(obj, propertyValue);
|
||||
}
|
||||
return obj;
|
||||
}
|
||||
|
||||
internal static bool IsNumberArray(Type type)
|
||||
{
|
||||
|
||||
|
||||
Reference in New Issue
Block a user