mirror of
https://gitee.com/dotnetchina/SqlSugar.git
synced 2025-08-24 07:22:57 +08:00
Enhanced navigation query Select
This commit is contained in:
parent
7addc23a6f
commit
165822aab6
@ -0,0 +1,161 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Linq.Expressions;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace SqlSugar
|
||||||
|
{
|
||||||
|
internal class NavSelectHelper
|
||||||
|
{
|
||||||
|
internal static List<TResult> GetList<T, TResult>(Expression<Func<T, TResult>> expression, QueryableProvider<T> queryableProvider)
|
||||||
|
{
|
||||||
|
List<TResult> result = new List <TResult>();
|
||||||
|
var isSqlFunc = IsSqlFunc(expression, queryableProvider);
|
||||||
|
if (isSqlFunc&&isGroup(expression, queryableProvider))
|
||||||
|
{
|
||||||
|
var sqlfuncQueryable = queryableProvider.Clone();
|
||||||
|
sqlfuncQueryable.QueryBuilder.Includes = null;
|
||||||
|
result = sqlfuncQueryable
|
||||||
|
.Select(expression)
|
||||||
|
.ToList();
|
||||||
|
var includeQueryable = queryableProvider.Clone();
|
||||||
|
includeQueryable.Select(GetGroupSelect(typeof(T), queryableProvider.Context));
|
||||||
|
includeQueryable.QueryBuilder.NoCheckInclude=true;
|
||||||
|
MegerList(result, includeQueryable.ToList(), sqlfuncQueryable.Context);
|
||||||
|
}
|
||||||
|
else if (isSqlFunc)
|
||||||
|
{
|
||||||
|
var sqlfuncQueryable = queryableProvider.Clone();
|
||||||
|
sqlfuncQueryable.QueryBuilder.Includes = null;
|
||||||
|
result = sqlfuncQueryable
|
||||||
|
.Select(expression)
|
||||||
|
.ToList();
|
||||||
|
var includeList = queryableProvider.Clone().ToList();
|
||||||
|
MegerList(result, includeList, sqlfuncQueryable.Context);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result= queryableProvider.ToList().Select(expression.Compile()).ToList();
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
internal static async Task<List<TResult>> GetListAsync<T, TResult>(Expression<Func<T, TResult>> expression, QueryableProvider<T> queryableProvider)
|
||||||
|
{
|
||||||
|
List<TResult> result = new List<TResult>();
|
||||||
|
var isSqlFunc = IsSqlFunc(expression, queryableProvider);
|
||||||
|
if (isSqlFunc && isGroup(expression, queryableProvider))
|
||||||
|
{
|
||||||
|
var sqlfuncQueryable = queryableProvider.Clone();
|
||||||
|
sqlfuncQueryable.QueryBuilder.Includes = null;
|
||||||
|
result =await sqlfuncQueryable
|
||||||
|
.Select(expression)
|
||||||
|
.ToListAsync();
|
||||||
|
var includeQueryable = queryableProvider.Clone();
|
||||||
|
includeQueryable.Select(GetGroupSelect(typeof(T), queryableProvider.Context));
|
||||||
|
includeQueryable.QueryBuilder.NoCheckInclude = true;
|
||||||
|
MegerList(result,await includeQueryable.ToListAsync(), sqlfuncQueryable.Context);
|
||||||
|
}
|
||||||
|
else if (isSqlFunc)
|
||||||
|
{
|
||||||
|
var sqlfuncQueryable = queryableProvider.Clone();
|
||||||
|
sqlfuncQueryable.QueryBuilder.Includes = null;
|
||||||
|
result =await sqlfuncQueryable
|
||||||
|
.Select(expression)
|
||||||
|
.ToListAsync();
|
||||||
|
var includeList =await queryableProvider.Clone().ToListAsync();
|
||||||
|
MegerList(result, includeList, sqlfuncQueryable.Context);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var list =await queryableProvider.ToListAsync();
|
||||||
|
result = list.Select(expression.Compile()).ToList();
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static string GetGroupSelect(Type type,SqlSugarProvider context)
|
||||||
|
{
|
||||||
|
var entity = context.EntityMaintenance.GetEntityInfo(type);
|
||||||
|
List<string> selector = new List<string>();
|
||||||
|
foreach (var item in entity.Columns.Where(it=>it.IsIgnore==false))
|
||||||
|
{
|
||||||
|
selector.Add($" min({item.DbColumnName}) as {item.DbColumnName}");
|
||||||
|
}
|
||||||
|
return string.Join(",", selector);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void MegerList<TResult, T>(List<TResult> result, List<T> includeList,SqlSugarProvider context)
|
||||||
|
{
|
||||||
|
if (result.Count != includeList.Count) return;
|
||||||
|
var columns = context.EntityMaintenance.GetEntityInfo<T>().Columns;
|
||||||
|
var resColumns = context.EntityMaintenance.GetEntityInfo<TResult>().Columns;
|
||||||
|
var i = 0;
|
||||||
|
foreach (var item in includeList)
|
||||||
|
{
|
||||||
|
foreach (var column in columns)
|
||||||
|
{
|
||||||
|
if (column.Navigat != null)
|
||||||
|
{
|
||||||
|
var value = column.PropertyInfo.GetValue(item);
|
||||||
|
var resColumn=resColumns
|
||||||
|
.FirstOrDefault(z=>
|
||||||
|
z.PropertyName.Equals(column.PropertyName)&&
|
||||||
|
z.PropertyInfo.PropertyType==column.PropertyInfo.PropertyType
|
||||||
|
);
|
||||||
|
if (resColumn != null)
|
||||||
|
{
|
||||||
|
var resItem= result[i];
|
||||||
|
resColumn.PropertyInfo.SetValue(resItem,value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static bool IsSqlFunc<T, TResult>(Expression<Func<T, TResult>> expression, QueryableProvider<T> queryableProvider)
|
||||||
|
{
|
||||||
|
var body=ExpressionTool.GetLambdaExpressionBody(expression);
|
||||||
|
if (body is NewExpression)
|
||||||
|
{
|
||||||
|
var newExp=((NewExpression)body);
|
||||||
|
foreach (var item in newExp.Arguments)
|
||||||
|
{
|
||||||
|
if (item is MethodCallExpression)
|
||||||
|
{
|
||||||
|
var method = ((MethodCallExpression)item).Method;
|
||||||
|
if (method.DeclaringType != null&& method.DeclaringType.Name=="SqlFunc")
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (body is MemberInitExpression)
|
||||||
|
{
|
||||||
|
var newExp = ((MemberInitExpression)body);
|
||||||
|
foreach (var item in newExp.Bindings)
|
||||||
|
{
|
||||||
|
MemberAssignment memberAssignment = (MemberAssignment)item;
|
||||||
|
if (memberAssignment.Expression is MethodCallExpression)
|
||||||
|
{
|
||||||
|
var method = ((MethodCallExpression)memberAssignment.Expression).Method;
|
||||||
|
if (method.DeclaringType != null && method.DeclaringType.Name == "SqlFunc")
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static bool isGroup<T, TResult>(Expression<Func<T, TResult>> expression, QueryableProvider<T> queryableProvider)
|
||||||
|
{
|
||||||
|
var isGroup=queryableProvider.QueryBuilder.GetGroupByString.HasValue();
|
||||||
|
return isGroup;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -981,8 +981,9 @@ namespace SqlSugar
|
|||||||
{
|
{
|
||||||
if (this.QueryBuilder.Includes != null && this.QueryBuilder.Includes.Count > 0)
|
if (this.QueryBuilder.Includes != null && this.QueryBuilder.Includes.Count > 0)
|
||||||
{
|
{
|
||||||
var list = this.ToList().Select(expression.Compile()).ToList();
|
return NavSelectHelper.GetList(expression,this);
|
||||||
return list;
|
// var list = this.ToList().Select(expression.Compile()).ToList();
|
||||||
|
// return list;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -994,9 +995,7 @@ namespace SqlSugar
|
|||||||
{
|
{
|
||||||
if (this.QueryBuilder.Includes != null && this.QueryBuilder.Includes.Count > 0)
|
if (this.QueryBuilder.Includes != null && this.QueryBuilder.Includes.Count > 0)
|
||||||
{
|
{
|
||||||
var result = await this.ToListAsync();
|
return await NavSelectHelper.GetListAsync(expression, this);
|
||||||
var list = result.Select(expression.Compile()).ToList();
|
|
||||||
return list;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -2781,7 +2780,7 @@ namespace SqlSugar
|
|||||||
if (this.QueryBuilder.Includes != null)
|
if (this.QueryBuilder.Includes != null)
|
||||||
{
|
{
|
||||||
var managers=(this.QueryBuilder.Includes as List<object>);
|
var managers=(this.QueryBuilder.Includes as List<object>);
|
||||||
if (this.QueryBuilder.SelectValue.HasValue())
|
if (this.QueryBuilder.SelectValue.HasValue()&& this.QueryBuilder.NoCheckInclude==false)
|
||||||
{
|
{
|
||||||
Check.ExceptionEasy("To use includes, use select after tolist()", "使用Includes请在ToList()之后在使用Select");
|
Check.ExceptionEasy("To use includes, use select after tolist()", "使用Includes请在ToList()之后在使用Select");
|
||||||
}
|
}
|
||||||
|
@ -762,6 +762,7 @@ namespace SqlSugar
|
|||||||
|
|
||||||
#region NoCopy
|
#region NoCopy
|
||||||
internal bool IsClone { get; set; }
|
internal bool IsClone { get; set; }
|
||||||
|
public bool NoCheckInclude { get; set; }
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
private string GetTableName(string entityName)
|
private string GetTableName(string entityName)
|
||||||
|
@ -108,6 +108,7 @@
|
|||||||
<Compile Include="Abstract\FastestProvider\Setting.cs" />
|
<Compile Include="Abstract\FastestProvider\Setting.cs" />
|
||||||
<Compile Include="Abstract\FastestProvider\SplitFastest.cs" />
|
<Compile Include="Abstract\FastestProvider\SplitFastest.cs" />
|
||||||
<Compile Include="Abstract\FilterProvider\FilterProvider.cs" />
|
<Compile Include="Abstract\FilterProvider\FilterProvider.cs" />
|
||||||
|
<Compile Include="Abstract\QueryableProvider\NavSelectHelper.cs" />
|
||||||
<Compile Include="Abstract\QueryableProvider\IncludesHelper.cs" />
|
<Compile Include="Abstract\QueryableProvider\IncludesHelper.cs" />
|
||||||
<Compile Include="Abstract\QueryableProvider\Includes.cs" />
|
<Compile Include="Abstract\QueryableProvider\Includes.cs" />
|
||||||
<Compile Include="Abstract\QueryableProvider\MappingFieldsHelper.cs" />
|
<Compile Include="Abstract\QueryableProvider\MappingFieldsHelper.cs" />
|
||||||
|
Loading…
Reference in New Issue
Block a user