mirror of
https://github.com/nsnail/FreeSql.git
synced 2025-06-19 20:38:16 +08:00
- 增加 ISelect.ToTreeList 扩展方法查询数据,加工为树型 List;(注意:实体需要配置父子导航属性)
This commit is contained in:
@ -23,18 +23,18 @@ namespace FreeSql.Internal.CommonProvider
|
||||
protected string _select = "SELECT ", _orderby, _groupby, _having;
|
||||
protected StringBuilder _where = new StringBuilder();
|
||||
protected List<DbParameter> _params = new List<DbParameter>();
|
||||
protected List<SelectTableInfo> _tables = new List<SelectTableInfo>();
|
||||
internal protected List<SelectTableInfo> _tables = new List<SelectTableInfo>();
|
||||
protected List<Func<Type, string, string>> _tableRules = new List<Func<Type, string, string>>();
|
||||
protected Func<Type, string, string> _aliasRule;
|
||||
protected string _tosqlAppendContent;
|
||||
protected StringBuilder _join = new StringBuilder();
|
||||
protected IFreeSql _orm;
|
||||
internal protected IFreeSql _orm;
|
||||
protected CommonUtils _commonUtils;
|
||||
protected CommonExpression _commonExpression;
|
||||
protected DbTransaction _transaction;
|
||||
protected DbConnection _connection;
|
||||
protected Action<object> _trackToList;
|
||||
protected List<Action<object>> _includeToList = new List<Action<object>>();
|
||||
internal protected Action<object> _trackToList;
|
||||
internal protected List<Action<object>> _includeToList = new List<Action<object>>();
|
||||
#if net40
|
||||
#else
|
||||
protected List<Func<object, Task>> _includeToListAsync = new List<Func<object, Task>>();
|
||||
|
@ -659,6 +659,93 @@ namespace FreeSql.Internal.CommonProvider
|
||||
foreach (var item in list)
|
||||
setListValue(item, null);
|
||||
|
||||
Action<List<TNavigate>, TableInfo> fillOneToManyData = (subList, tbref2) =>
|
||||
{
|
||||
if (subList.Any() == false)
|
||||
{
|
||||
foreach (var item in list)
|
||||
setListValue(item, new List<TNavigate>());
|
||||
return;
|
||||
}
|
||||
|
||||
Dictionary<string, List<Tuple<T1, List<TNavigate>>>> dicList = new Dictionary<string, List<Tuple<T1, List<TNavigate>>>>();
|
||||
foreach (var item in list)
|
||||
{
|
||||
if (tbref.Columns.Count == 1)
|
||||
{
|
||||
var dicListKey = getListValue(item, tbref.Columns[0].CsName, 0)?.ToString();
|
||||
if (dicListKey == null) continue;
|
||||
var dicListVal = Tuple.Create(item, new List<TNavigate>());
|
||||
if (dicList.TryGetValue(dicListKey, out var items) == false)
|
||||
dicList.Add(dicListKey, items = new List<Tuple<T1, List<TNavigate>>>());
|
||||
items.Add(dicListVal);
|
||||
}
|
||||
else
|
||||
{
|
||||
var sb = new StringBuilder();
|
||||
for (var z = 0; z < tbref.Columns.Count; z++)
|
||||
{
|
||||
if (z > 0) sb.Append("*$*");
|
||||
sb.Append(getListValue(item, tbref.Columns[z].CsName, z));
|
||||
}
|
||||
var dicListKey = sb.ToString();
|
||||
var dicListVal = Tuple.Create(item, new List<TNavigate>());
|
||||
if (dicList.TryGetValue(dicListKey, out var items) == false)
|
||||
dicList.Add(dicListKey, items = new List<Tuple<T1, List<TNavigate>>>());
|
||||
items.Add(dicListVal);
|
||||
sb.Clear();
|
||||
}
|
||||
}
|
||||
var parentNavs = new List<string>();
|
||||
foreach (var navProp in tbref2.Properties)
|
||||
{
|
||||
if (tbref2.ColumnsByCs.ContainsKey(navProp.Key)) continue;
|
||||
if (tbref2.ColumnsByCsIgnore.ContainsKey(navProp.Key)) continue;
|
||||
var tr2ref = tbref2.GetTableRef(navProp.Key, false);
|
||||
if (tr2ref == null) continue;
|
||||
if (tr2ref.RefType != TableRefType.ManyToOne) continue;
|
||||
if (tr2ref.RefEntityType != tb.Type) continue;
|
||||
parentNavs.Add(navProp.Key);
|
||||
}
|
||||
foreach (var nav in subList)
|
||||
{
|
||||
string key = null;
|
||||
if (tbref.RefColumns.Count == 1)
|
||||
{
|
||||
key = _orm.GetEntityValueWithPropertyName(tbref.RefEntityType, nav, tbref.RefColumns[0].CsName).ToString();
|
||||
}
|
||||
else
|
||||
{
|
||||
var sb = new StringBuilder();
|
||||
for (var z = 0; z < tbref.RefColumns.Count; z++)
|
||||
{
|
||||
if (z > 0) sb.Append("*$*");
|
||||
sb.Append(_orm.GetEntityValueWithPropertyName(tbref.RefEntityType, nav, tbref.RefColumns[z].CsName));
|
||||
}
|
||||
key = sb.ToString();
|
||||
sb.Clear();
|
||||
}
|
||||
if (dicList.TryGetValue(key, out var t1items) == false) continue;
|
||||
foreach (var t1item in t1items)
|
||||
t1item.Item2.Add(nav);
|
||||
|
||||
//将子集合的,多对一,对象设置为当前对象
|
||||
foreach (var parentNav in parentNavs)
|
||||
foreach (var t1item in t1items)
|
||||
_orm.SetEntityValueWithPropertyName(tbref.RefMiddleEntityType, nav, parentNav, t1item.Item1);
|
||||
}
|
||||
foreach (var t1items in dicList.Values)
|
||||
foreach (var t1item in t1items)
|
||||
setListValue(t1item.Item1, t1item.Item2);
|
||||
dicList.Clear();
|
||||
};
|
||||
|
||||
if (tbref.RefType == TableRefType.OneToMany && _includeManySubListOneToManyTempValue1 != null && _includeManySubListOneToManyTempValue1 is List<TNavigate>)
|
||||
{
|
||||
fillOneToManyData(_includeManySubListOneToManyTempValue1 as List<TNavigate>, _commonUtils.GetTableByEntity(tbref.RefEntityType));
|
||||
return;
|
||||
}
|
||||
|
||||
var subSelect = _orm.Select<TNavigate>()
|
||||
.DisableGlobalFilter()
|
||||
.WithConnection(_connection)
|
||||
@ -794,83 +881,7 @@ namespace FreeSql.Internal.CommonProvider
|
||||
}
|
||||
}
|
||||
|
||||
if (subList.Any() == false)
|
||||
{
|
||||
foreach (var item in list)
|
||||
setListValue(item, new List<TNavigate>());
|
||||
return;
|
||||
}
|
||||
|
||||
Dictionary<string, List<Tuple<T1, List<TNavigate>>>> dicList = new Dictionary<string, List<Tuple<T1, List<TNavigate>>>>();
|
||||
foreach (var item in list)
|
||||
{
|
||||
if (tbref.Columns.Count == 1)
|
||||
{
|
||||
var dicListKey = getListValue(item, tbref.Columns[0].CsName, 0)?.ToString();
|
||||
if (dicListKey == null) continue;
|
||||
var dicListVal = Tuple.Create(item, new List<TNavigate>());
|
||||
if (dicList.TryGetValue(dicListKey, out var items) == false)
|
||||
dicList.Add(dicListKey, items = new List<Tuple<T1, List<TNavigate>>>());
|
||||
items.Add(dicListVal);
|
||||
}
|
||||
else
|
||||
{
|
||||
var sb = new StringBuilder();
|
||||
for (var z = 0; z < tbref.Columns.Count; z++)
|
||||
{
|
||||
if (z > 0) sb.Append("*$*");
|
||||
sb.Append(getListValue(item, tbref.Columns[z].CsName, z));
|
||||
}
|
||||
var dicListKey = sb.ToString();
|
||||
var dicListVal = Tuple.Create(item, new List<TNavigate>());
|
||||
if (dicList.TryGetValue(dicListKey, out var items) == false)
|
||||
dicList.Add(dicListKey, items = new List<Tuple<T1, List<TNavigate>>>());
|
||||
items.Add(dicListVal);
|
||||
sb.Clear();
|
||||
}
|
||||
}
|
||||
var parentNavs = new List<string>();
|
||||
foreach (var navProp in tbref2.Properties)
|
||||
{
|
||||
if (tbref2.ColumnsByCs.ContainsKey(navProp.Key)) continue;
|
||||
if (tbref2.ColumnsByCsIgnore.ContainsKey(navProp.Key)) continue;
|
||||
var tr2ref = tbref2.GetTableRef(navProp.Key, false);
|
||||
if (tr2ref == null) continue;
|
||||
if (tr2ref.RefType != TableRefType.ManyToOne) continue;
|
||||
if (tr2ref.RefEntityType != tb.Type) continue;
|
||||
parentNavs.Add(navProp.Key);
|
||||
}
|
||||
foreach (var nav in subList)
|
||||
{
|
||||
string key = null;
|
||||
if (tbref.RefColumns.Count == 1)
|
||||
{
|
||||
key = _orm.GetEntityValueWithPropertyName(tbref.RefEntityType, nav, tbref.RefColumns[0].CsName).ToString();
|
||||
}
|
||||
else
|
||||
{
|
||||
var sb = new StringBuilder();
|
||||
for (var z = 0; z < tbref.RefColumns.Count; z++)
|
||||
{
|
||||
if (z > 0) sb.Append("*$*");
|
||||
sb.Append(_orm.GetEntityValueWithPropertyName(tbref.RefEntityType, nav, tbref.RefColumns[z].CsName));
|
||||
}
|
||||
key = sb.ToString();
|
||||
sb.Clear();
|
||||
}
|
||||
if (dicList.TryGetValue(key, out var t1items) == false) return;
|
||||
foreach (var t1item in t1items)
|
||||
t1item.Item2.Add(nav);
|
||||
|
||||
//将子集合的,多对一,对象设置为当前对象
|
||||
foreach (var parentNav in parentNavs)
|
||||
foreach (var t1item in t1items)
|
||||
_orm.SetEntityValueWithPropertyName(tbref.RefMiddleEntityType, nav, parentNav, t1item.Item1);
|
||||
}
|
||||
foreach (var t1items in dicList.Values)
|
||||
foreach (var t1item in t1items)
|
||||
setListValue(t1item.Item1, t1item.Item2);
|
||||
dicList.Clear();
|
||||
fillOneToManyData(subList, tbref2);
|
||||
}
|
||||
break;
|
||||
case TableRefType.ManyToMany:
|
||||
@ -1044,7 +1055,7 @@ namespace FreeSql.Internal.CommonProvider
|
||||
key = sb.ToString();
|
||||
sb.Clear();
|
||||
}
|
||||
if (dicList.TryGetValue(key, out var t1items) == false) return;
|
||||
if (dicList.TryGetValue(key, out var t1items) == false) continue;
|
||||
foreach (var t1item in t1items)
|
||||
t1item.Item2.Add(subList[a]);
|
||||
}
|
||||
@ -1065,6 +1076,7 @@ namespace FreeSql.Internal.CommonProvider
|
||||
return this;
|
||||
}
|
||||
|
||||
internal object _includeManySubListOneToManyTempValue1 = null;
|
||||
internal void SetList(IEnumerable<T1> list)
|
||||
{
|
||||
foreach (var include in _includeToList) include?.Invoke(list);
|
||||
|
Reference in New Issue
Block a user