Update nav expression to sql

This commit is contained in:
sunkaixuan
2022-04-13 14:05:51 +08:00
parent b3905ed9d2
commit 90186eee2a
3 changed files with 66 additions and 10 deletions

View File

@@ -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>();

View File

@@ -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)
{

View File

@@ -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;
}
}
}