mirror of
https://gitee.com/dotnetchina/SqlSugar.git
synced 2025-09-20 18:48:09 +08:00
db.Queryable.Includes.Select.ToList
This commit is contained in:
@@ -0,0 +1,12 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
namespace SqlSugar
|
||||
{
|
||||
internal class AppendNavInfo
|
||||
{
|
||||
public Dictionary<string, string> MappingNavProperties = new Dictionary<string, string>();
|
||||
public Dictionary<string, string> AppendProperties = new Dictionary<string, string>();
|
||||
}
|
||||
}
|
@@ -556,6 +556,54 @@ namespace SqlSugar
|
||||
#endregion
|
||||
|
||||
#region Navigate
|
||||
private bool IsAppendNavColumns()
|
||||
{
|
||||
return this.QueryBuilder.Includes.HasValue() && this.QueryBuilder.AppendNavInfo == null;
|
||||
}
|
||||
|
||||
private 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);
|
||||
foreach (var item in pkColumns)
|
||||
{
|
||||
navInfo.AppendProperties.Add(item.PropertyName,item.DbColumnName);
|
||||
}
|
||||
foreach (var item in dic)
|
||||
{
|
||||
var value=item.Value;
|
||||
}
|
||||
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)
|
||||
@@ -570,8 +618,23 @@ namespace SqlSugar
|
||||
var managers = (this.QueryBuilder.Includes as List<object>);
|
||||
if (this.QueryBuilder.SelectValue.HasValue() && this.QueryBuilder.NoCheckInclude == false)
|
||||
{
|
||||
Check.ExceptionEasy("To use includes, use select after tolist()", "使用Includes请在ToList()之后在使用Select");
|
||||
foreach (var it in managers)
|
||||
{
|
||||
var manager =it;
|
||||
var p= it.GetType().GetProperty("RootList");
|
||||
var tType = it.GetType().GenericTypeArguments[0];
|
||||
var listType = typeof(List<>).MakeGenericType(tType);
|
||||
var outList = Activator.CreateInstance(listType);
|
||||
p.SetValue(it, outList);
|
||||
foreach (var item in result)
|
||||
{
|
||||
(outList as IList).Add(Activator.CreateInstance(tType));
|
||||
}
|
||||
it.GetType().GetMethod("Execute").Invoke(it,null);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
foreach (var it in managers)
|
||||
{
|
||||
var manager = it as NavigatManager<TResult>;
|
||||
@@ -580,6 +643,7 @@ namespace SqlSugar
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
protected void _Mapper<TResult>(List<TResult> result)
|
||||
{
|
||||
if (this.EntityInfo.Columns.Any(it => it.IsTranscoding))
|
||||
@@ -1578,6 +1642,7 @@ 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();
|
||||
asyncQueryableBuilder.AppendNavInfo = this.Context.Utilities.TranslateCopy(this.QueryBuilder.AppendNavInfo);
|
||||
}
|
||||
|
||||
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)
|
||||
|
@@ -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; }
|
||||
|
@@ -11,7 +11,12 @@ namespace SqlSugar
|
||||
{
|
||||
public static Dictionary<string, Expression> GetNewExpressionItemList(Expression lamExp)
|
||||
{
|
||||
var exp=GetLambdaExpressionBody(lamExp)as NewExpression;
|
||||
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++)
|
||||
|
Reference in New Issue
Block a user