mirror of
https://gitee.com/dotnetchina/SqlSugar.git
synced 2025-10-25 18:29:13 +08:00
Update exp to sql
This commit is contained in:
@@ -55,6 +55,7 @@ namespace OrmTest
|
|||||||
var list2 = db.Queryable<StudentA>()
|
var list2 = db.Queryable<StudentA>()
|
||||||
.Includes(x => x.SchoolA, x => x.RoomList)//2个参数就是 then Include
|
.Includes(x => x.SchoolA, x => x.RoomList)//2个参数就是 then Include
|
||||||
.Includes(x => x.Books)
|
.Includes(x => x.Books)
|
||||||
|
.Where(x=>x.Books.Any())
|
||||||
.Where(x => x.SchoolA.SchoolName == "北大")
|
.Where(x => x.SchoolA.SchoolName == "北大")
|
||||||
.ToList();
|
.ToList();
|
||||||
|
|
||||||
@@ -98,13 +99,16 @@ namespace OrmTest
|
|||||||
|
|
||||||
|
|
||||||
var list21111 = new List<Tree1>();
|
var list21111 = new List<Tree1>();
|
||||||
db.Queryable<Tree1>()
|
var xxx= db.Queryable<Tree1>()
|
||||||
.Includes(it => it.Child)
|
.Includes(it => it.Child)
|
||||||
.Includes(it => it.Parent)
|
.Includes(it => it.Parent)
|
||||||
.ForEach(item => {
|
.Where(it=>it.Child.Any())
|
||||||
list21111.Add(item);
|
.ToList();
|
||||||
}, 2);
|
|
||||||
|
|
||||||
|
db.ThenMapper(xxx, it =>
|
||||||
|
{
|
||||||
|
it.Child = it.Child.OrderBy(x => x.Id).ToList();
|
||||||
|
});
|
||||||
//var json = db.Utilities.SerializeObject(list4);
|
//var json = db.Utilities.SerializeObject(list4);
|
||||||
|
|
||||||
db.CodeFirst.InitTables<UnitA001, UnitA002>();
|
db.CodeFirst.InitTables<UnitA001, UnitA002>();
|
||||||
|
|||||||
@@ -221,6 +221,7 @@ namespace SqlSugar
|
|||||||
this.MappingType = MappingTableType;
|
this.MappingType = MappingTableType;
|
||||||
this.MappingAId = typeAiD;
|
this.MappingAId = typeAiD;
|
||||||
this.MappingBId = typeBId;
|
this.MappingBId = typeBId;
|
||||||
|
this.NavigatType = NavigatType.ManyToMany;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -244,6 +244,15 @@ namespace SqlSugar
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
OneToManyNavgateExpression nav=new OneToManyNavgateExpression(this.Context?.SugarContext?.Context);
|
||||||
|
if (nav.IsNavgate(express))
|
||||||
|
{
|
||||||
|
var sql = nav.GetSql();
|
||||||
|
this.Context.SingleTableNameSubqueryShortName = nav.ShorName;
|
||||||
|
base.AppendValue(parameter, isLeft, sql);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
var constValue = ExpressionTool.DynamicInvoke(express);
|
var constValue = ExpressionTool.DynamicInvoke(express);
|
||||||
if (constValue is MapperSql)
|
if (constValue is MapperSql)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -22,36 +22,43 @@ namespace SqlSugar
|
|||||||
|
|
||||||
internal bool IsNavgate(Expression expression)
|
internal bool IsNavgate(Expression expression)
|
||||||
{
|
{
|
||||||
|
var result = false;
|
||||||
var exp = expression;
|
var exp = expression;
|
||||||
if (exp is UnaryExpression)
|
if (exp is UnaryExpression)
|
||||||
{
|
{
|
||||||
exp = (exp as UnaryExpression).Operand;
|
exp = (exp as UnaryExpression).Operand;
|
||||||
}
|
}
|
||||||
if (exp is MemberExpression)
|
if (exp is MemberExpression)
|
||||||
{
|
{
|
||||||
var memberExp=exp as MemberExpression;
|
var memberExp = exp as MemberExpression;
|
||||||
var childExpression = memberExp.Expression;
|
var childExpression = memberExp.Expression;
|
||||||
if (childExpression != null && childExpression is MemberExpression)
|
result = ValidateNav(result, memberExp, childExpression);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
private bool ValidateNav(bool result, MemberExpression memberExp, Expression childExpression)
|
||||||
|
{
|
||||||
|
if (childExpression != null && childExpression is MemberExpression)
|
||||||
|
{
|
||||||
|
var child2Expression = (childExpression as MemberExpression).Expression;
|
||||||
|
if (child2Expression.Type.IsClass() && child2Expression is ParameterExpression)
|
||||||
{
|
{
|
||||||
var child2Expression = (childExpression as MemberExpression).Expression;
|
var entity = this.context.EntityMaintenance.GetEntityInfo(child2Expression.Type);
|
||||||
if (child2Expression.Type.IsClass()&& child2Expression is ParameterExpression)
|
if (entity.Columns.Any(x => x.PropertyName == (childExpression as MemberExpression).Member.Name && x.Navigat != null))
|
||||||
{
|
{
|
||||||
var entity= this.context.EntityMaintenance.GetEntityInfo(child2Expression.Type);
|
EntityInfo = entity;
|
||||||
if (entity.Columns.Any(x => x.PropertyName == (childExpression as MemberExpression).Member.Name && x.Navigat != null))
|
ShorName = child2Expression.ToString();
|
||||||
{
|
MemberName = memberExp.Member.Name;
|
||||||
EntityInfo = entity;
|
ProPertyEntity = this.context.EntityMaintenance.GetEntityInfo(childExpression.Type);
|
||||||
ShorName = child2Expression.ToString();
|
Navigat = entity.Columns.FirstOrDefault(x => x.PropertyName == (childExpression as MemberExpression).Member.Name).Navigat;
|
||||||
MemberName= memberExp.Member.Name;
|
result = true;
|
||||||
ProPertyEntity = this.context.EntityMaintenance.GetEntityInfo(childExpression.Type);
|
|
||||||
Navigat = entity.Columns.FirstOrDefault(x => x.PropertyName == (childExpression as MemberExpression).Member.Name).Navigat;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
internal MapperSql GetSql()
|
internal MapperSql GetSql()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -0,0 +1,126 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Linq.Expressions;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace SqlSugar
|
||||||
|
{
|
||||||
|
internal class OneToManyNavgateExpression
|
||||||
|
{
|
||||||
|
private SqlSugarProvider context;
|
||||||
|
private EntityInfo EntityInfo;
|
||||||
|
private EntityInfo ProPertyEntity;
|
||||||
|
private Navigat Navigat;
|
||||||
|
public string ShorName;
|
||||||
|
private string MemberName;
|
||||||
|
private string MethodName;
|
||||||
|
public OneToManyNavgateExpression(SqlSugarProvider context)
|
||||||
|
{
|
||||||
|
this.context = context;
|
||||||
|
}
|
||||||
|
|
||||||
|
internal bool IsNavgate(Expression expression)
|
||||||
|
{
|
||||||
|
var result = false;
|
||||||
|
var exp = expression;
|
||||||
|
if (exp is UnaryExpression)
|
||||||
|
{
|
||||||
|
exp = (exp as UnaryExpression).Operand;
|
||||||
|
}
|
||||||
|
if (exp is MethodCallExpression)
|
||||||
|
{
|
||||||
|
var memberExp=exp as MethodCallExpression;
|
||||||
|
MethodName = memberExp.Method.Name;
|
||||||
|
if (memberExp.Method.Name.IsIn("Any","Count") && memberExp.Arguments.Count>0 && memberExp.Arguments[0] is MemberExpression )
|
||||||
|
{
|
||||||
|
result = ValidateNav(result, memberExp.Arguments[0] as MemberExpression, memberExp.Arguments[0]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
private bool ValidateNav(bool result, MemberExpression memberExp, Expression childExpression)
|
||||||
|
{
|
||||||
|
if (childExpression != null && childExpression is MemberExpression)
|
||||||
|
{
|
||||||
|
var child2Expression = (childExpression as MemberExpression).Expression;
|
||||||
|
if (child2Expression.Type.IsClass() && child2Expression is ParameterExpression)
|
||||||
|
{
|
||||||
|
var rootType = child2Expression.Type;
|
||||||
|
var rootEntity = this.context.EntityMaintenance.GetEntityInfo(rootType);
|
||||||
|
var type= childExpression.Type.GetGenericArguments()[0];
|
||||||
|
var entity = this.context.EntityMaintenance.GetEntityInfo(type);
|
||||||
|
if (rootEntity.Columns.Any(x => x.PropertyName == (childExpression as MemberExpression).Member.Name && x.Navigat != null))
|
||||||
|
{
|
||||||
|
EntityInfo = rootEntity;
|
||||||
|
ShorName = child2Expression.ToString();
|
||||||
|
MemberName = memberExp.Member.Name;
|
||||||
|
ProPertyEntity = entity;
|
||||||
|
Navigat = rootEntity.Columns.FirstOrDefault(x => x.PropertyName == (childExpression as MemberExpression).Member.Name).Navigat;
|
||||||
|
result = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
internal MapperSql GetSql()
|
||||||
|
{
|
||||||
|
if (Navigat.NavigatType == NavigatType.OneToMany)
|
||||||
|
{
|
||||||
|
return GetOneToManySql();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return GetManyToManySql();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
private MapperSql GetManyToManySql()
|
||||||
|
{
|
||||||
|
var pk = this.ProPertyEntity.Columns.First(it => it.IsPrimarykey == true).DbColumnName;
|
||||||
|
var name = this.EntityInfo.Columns.First(it => it.PropertyName == Navigat.Name).DbColumnName;
|
||||||
|
var selectName = this.ProPertyEntity.Columns.First(it => it.PropertyName == MemberName).DbColumnName;
|
||||||
|
MapperSql mapper = new MapperSql();
|
||||||
|
var queryable = this.context.Queryable<object>();
|
||||||
|
pk = queryable.QueryBuilder.Builder.GetTranslationColumnName(pk);
|
||||||
|
name = queryable.QueryBuilder.Builder.GetTranslationColumnName(name);
|
||||||
|
selectName = queryable.QueryBuilder.Builder.GetTranslationColumnName(selectName);
|
||||||
|
mapper.Sql = queryable
|
||||||
|
.AS(this.ProPertyEntity.DbTableName)
|
||||||
|
.Where($" {ShorName}.{name}={pk} ").Select(selectName).ToSql().Key;
|
||||||
|
mapper.Sql = $" ({mapper.Sql}) ";
|
||||||
|
mapper.Sql = GetMethodSql(mapper.Sql);
|
||||||
|
return mapper;
|
||||||
|
}
|
||||||
|
private MapperSql GetOneToManySql()
|
||||||
|
{
|
||||||
|
var pk = this.EntityInfo.Columns.First(it => it.IsPrimarykey == true).DbColumnName;
|
||||||
|
var name = this.ProPertyEntity.Columns.First(it => it.PropertyName == Navigat.Name).DbColumnName;
|
||||||
|
//var selectName = this.ProPertyEntity.Columns.First(it => it.PropertyName == MemberName).DbColumnName;
|
||||||
|
MapperSql mapper = new MapperSql();
|
||||||
|
var queryable = this.context.Queryable<object>();
|
||||||
|
pk = queryable.QueryBuilder.Builder.GetTranslationColumnName(pk);
|
||||||
|
name = queryable.QueryBuilder.Builder.GetTranslationColumnName(name);
|
||||||
|
//selectName = queryable.QueryBuilder.Builder.GetTranslationColumnName(selectName);
|
||||||
|
mapper.Sql = queryable
|
||||||
|
.AS(this.ProPertyEntity.DbTableName)
|
||||||
|
.Where($" {name}={ShorName}.{pk} ").Select(" COUNT(1) ").ToSql().Key;
|
||||||
|
mapper.Sql = $" ({mapper.Sql}) ";
|
||||||
|
mapper.Sql = GetMethodSql(mapper.Sql);
|
||||||
|
return mapper;
|
||||||
|
}
|
||||||
|
|
||||||
|
private string GetMethodSql(string sql)
|
||||||
|
{
|
||||||
|
if (MethodName == "Any")
|
||||||
|
{
|
||||||
|
return $" ({sql}>0 ) ";
|
||||||
|
}
|
||||||
|
return sql;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -105,6 +105,7 @@
|
|||||||
<Compile Include="Enum\SugarActionType.cs" />
|
<Compile Include="Enum\SugarActionType.cs" />
|
||||||
<Compile Include="Entities\SugarConnection.cs" />
|
<Compile Include="Entities\SugarConnection.cs" />
|
||||||
<Compile Include="ExpressionsToSql\Common\ExpressionOutParameter.cs" />
|
<Compile Include="ExpressionsToSql\Common\ExpressionOutParameter.cs" />
|
||||||
|
<Compile Include="ExpressionsToSql\ResolveItems\NavgateExpressionCall.cs" />
|
||||||
<Compile Include="ExpressionsToSql\ResolveItems\NavgateExpression.cs" />
|
<Compile Include="ExpressionsToSql\ResolveItems\NavgateExpression.cs" />
|
||||||
<Compile Include="ExpressionsToSql\Subquery\SubTemplate.cs" />
|
<Compile Include="ExpressionsToSql\Subquery\SubTemplate.cs" />
|
||||||
<Compile Include="ExpressionsToSql\Subquery\SubqueryableN.cs" />
|
<Compile Include="ExpressionsToSql\Subquery\SubqueryableN.cs" />
|
||||||
|
|||||||
Reference in New Issue
Block a user