mirror of
https://gitee.com/dotnetchina/SqlSugar.git
synced 2025-10-25 10:19:17 +08:00
Update nav expression to sql
This commit is contained in:
@@ -51,6 +51,13 @@ namespace OrmTest
|
||||
db.Insertable(new BookA() { BookId = 4, Name = "php", studenId = 3 }).ExecuteCommand();
|
||||
db.Insertable(new BookA() { BookId = 5, Name = "js", studenId = 4 }).ExecuteCommand();
|
||||
|
||||
|
||||
var list2 = db.Queryable<StudentA>()
|
||||
.Includes(x => x.SchoolA, x => x.RoomList)//2个参数就是 then Include
|
||||
.Includes(x => x.Books)
|
||||
.Where(x => x.SchoolA.SchoolName == "北大")
|
||||
.ToList();
|
||||
|
||||
//先用Mapper导航映射查出第二层
|
||||
var list = db.Queryable<StudentA>().Mapper(x => x.SchoolA, x => x.SchoolId).ToList();
|
||||
|
||||
@@ -65,10 +72,7 @@ namespace OrmTest
|
||||
});
|
||||
|
||||
|
||||
var list2=db.Queryable<StudentA>()
|
||||
.Includes(x => x.SchoolA, x => x.RoomList)//2个参数就是 then Include
|
||||
.Includes(x => x.Books)
|
||||
.ToList();
|
||||
|
||||
db.CodeFirst.InitTables<A1, B1, ABMapping1>();
|
||||
db.DbMaintenance.TruncateTable<A1>();
|
||||
db.DbMaintenance.TruncateTable<B1>();
|
||||
|
||||
@@ -58,7 +58,24 @@ namespace SqlSugar
|
||||
}
|
||||
else if (isMemberValue)
|
||||
{
|
||||
ResolveMemberValue(parameter, baseParameter, isLeft, isSetTempData, expression);
|
||||
var nav = new OneToOneNavgateExpression(this.Context?.SugarContext?.Context);
|
||||
if (nav.IsNavgate(expression))
|
||||
{
|
||||
var value = nav.GetSql();
|
||||
this.Context.SingleTableNameSubqueryShortName = nav.ShorName;
|
||||
if (isSetTempData)
|
||||
{
|
||||
baseParameter.CommonTempData = value;
|
||||
}
|
||||
else
|
||||
{
|
||||
AppendValue(parameter, isLeft, value);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
ResolveMemberValue(parameter, baseParameter, isLeft, isSetTempData, expression);
|
||||
}
|
||||
}
|
||||
else if (fieldIsBool && !isField && !isSelectField)
|
||||
{
|
||||
|
||||
@@ -7,11 +7,15 @@ using System.Threading.Tasks;
|
||||
|
||||
namespace SqlSugar
|
||||
{
|
||||
internal class NavgateExpression
|
||||
internal class OneToOneNavgateExpression
|
||||
{
|
||||
private SqlSugarProvider context;
|
||||
|
||||
public NavgateExpression(SqlSugarProvider context)
|
||||
private EntityInfo EntityInfo;
|
||||
private EntityInfo ProPertyEntity;
|
||||
private Navigat Navigat;
|
||||
public string ShorName;
|
||||
private string MemberName;
|
||||
public OneToOneNavgateExpression(SqlSugarProvider context)
|
||||
{
|
||||
this.context = context;
|
||||
}
|
||||
@@ -26,13 +30,44 @@ namespace SqlSugar
|
||||
if (exp is MemberExpression)
|
||||
{
|
||||
var memberExp=exp as MemberExpression;
|
||||
var childExpression = memberExp.Expression;
|
||||
if (childExpression != null && childExpression is MemberExpression)
|
||||
{
|
||||
var child2Expression = (childExpression as MemberExpression).Expression;
|
||||
if (child2Expression.Type.IsClass()&& child2Expression is ParameterExpression)
|
||||
{
|
||||
var entity= this.context.EntityMaintenance.GetEntityInfo(child2Expression.Type);
|
||||
if (entity.Columns.Any(x => x.PropertyName == (childExpression as MemberExpression).Member.Name && x.Navigat != null))
|
||||
{
|
||||
EntityInfo = entity;
|
||||
ShorName = child2Expression.ToString();
|
||||
MemberName= memberExp.Member.Name;
|
||||
ProPertyEntity = this.context.EntityMaintenance.GetEntityInfo(childExpression.Type);
|
||||
Navigat = entity.Columns.FirstOrDefault(x => x.PropertyName == (childExpression as MemberExpression).Member.Name).Navigat;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
internal void Execute(MapperExpressionResolve mapperExpressionResolve)
|
||||
|
||||
internal MapperSql GetSql()
|
||||
{
|
||||
|
||||
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}) ";
|
||||
return mapper;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user