Update .net core project

This commit is contained in:
sunkaixuan 2022-07-15 13:32:18 +08:00
parent 6c2ae0f335
commit 0952b28c68
8 changed files with 107 additions and 21 deletions

View File

@ -46,6 +46,22 @@ namespace SqlSugar
return this.Context.EntityMaintenance.GetEntityInfo<T>(); return this.Context.EntityMaintenance.GetEntityInfo<T>();
} }
} }
public ISugarQueryable<T> IncludeLeftJoin(Expression<Func<T, object>> LeftObject)
{
MemberExpression memberExpression;
string navObjectName;
EntityColumnInfo navColumn, navPkColumn;
EntityInfo navEntityInfo;
ExpressionTool.GetOneToOneInfo(this.Context,LeftObject, out memberExpression, out navObjectName, out navColumn, out navEntityInfo, out navPkColumn);
var shortName = $"pnv_{navObjectName}";
var mainShortName = memberExpression.Expression.ToString();
this.QueryBuilder.TableShortName = mainShortName;
var onWhere = $"{shortName}.{navPkColumn.DbColumnName}={mainShortName}.{navColumn.DbColumnName}";
UtilMethods.IsNullReturnNew(this.Context.TempItems);
this.AddJoinInfo(navEntityInfo.DbTableName, shortName, onWhere, JoinType.Left);
return this;
}
public ISugarQueryable<T, T2> LeftJoin<T2>(ISugarQueryable<T2> joinQueryable, Expression<Func<T, T2, bool>> joinExpression) public ISugarQueryable<T, T2> LeftJoin<T2>(ISugarQueryable<T2> joinQueryable, Expression<Func<T, T2, bool>> joinExpression)
{ {
this.Context.InitMappingInfo<T2>(); this.Context.InitMappingInfo<T2>();

View File

@ -246,7 +246,7 @@ namespace SqlSugar
{ {
resolveExpress.PgSqlIsAutoToLower = true; resolveExpress.PgSqlIsAutoToLower = true;
} }
resolveExpress.SugarContext = new ExpressionOutParameter() { Context = this.Context }; resolveExpress.SugarContext = new ExpressionOutParameter() { Context = this.Context, QueryBuilder = this } ;
resolveExpress.RootExpression = expression; resolveExpress.RootExpression = expression;
resolveExpress.JoinQueryInfos = Builder.QueryBuilder.JoinQueryInfos; resolveExpress.JoinQueryInfos = Builder.QueryBuilder.JoinQueryInfos;
resolveExpress.IsSingle = IsSingle()&& resolveType!= ResolveExpressType.WhereMultiple; resolveExpress.IsSingle = IsSingle()&& resolveType!= ResolveExpressType.WhereMultiple;

View File

@ -6,6 +6,7 @@ using System.Text;
namespace SqlSugar namespace SqlSugar
{ {
public class JoinQueryInfo public class JoinQueryInfo
{ {
public JoinType JoinType { get; set; } public JoinType JoinType { get; set; }

View File

@ -9,5 +9,6 @@ namespace SqlSugar
public class ExpressionOutParameter public class ExpressionOutParameter
{ {
public SqlSugarProvider Context { get; set; } public SqlSugarProvider Context { get; set; }
public QueryBuilder QueryBuilder { get; set; }
} }
} }

View File

@ -60,6 +60,33 @@ namespace SqlSugar
} }
} }
public static void GetOneToOneInfo<T>(SqlSugarProvider context,Expression<Func<T, object>> LeftObject, out MemberExpression memberExpression, out string navObjectName, out EntityColumnInfo navColumn, out EntityInfo navEntityInfo, out EntityColumnInfo navPkColumn)
{
memberExpression = ((LeftObject as LambdaExpression).Body as MemberExpression);
var listItemType = typeof(T);
var listItemEntity = context.EntityMaintenance.GetEntityInfo(listItemType);
var listPkColumn = listItemEntity.Columns.Where(it => it.IsPrimarykey).FirstOrDefault();
navObjectName = memberExpression.Member.Name;
var navObjectName2 = navObjectName;
var navObjectNamePropety = listItemType.GetProperty(navObjectName);
var navObjectNameColumnInfo = listItemEntity.Columns.First(it => it.PropertyName == navObjectName2);
Check.ExceptionEasy(navObjectNameColumnInfo.Navigat == null, $"{navObjectName} not [Navigat(..)] ", $"{navObjectName} 没有导航特性 [Navigat(..)] ");
Check.ExceptionEasy(navObjectNameColumnInfo.Navigat.NavigatType != NavigateType.OneToOne, $"IncludeLeftJoin can only be one-on-one ", $"IncludeLeftJoin 只能是一对一 ");
navColumn = listItemEntity.Columns.FirstOrDefault(it => it.PropertyName == navObjectNameColumnInfo.Navigat.Name);
Check.ExceptionEasy(navColumn == null, "OneToOne navigation configuration error", $"OneToOne导航配置错误 实体{ listItemEntity.EntityName } 不存在{navObjectNameColumnInfo.Navigat.Name}");
var navType = navObjectNamePropety.PropertyType;
navEntityInfo = context.EntityMaintenance.GetEntityInfo(navType);
context.InitMappingInfo(navEntityInfo.Type);
navPkColumn = navEntityInfo.Columns.Where(it => it.IsPrimarykey).FirstOrDefault();
Check.ExceptionEasy(navPkColumn == null && navObjectNameColumnInfo.Navigat.Name2 == null, navEntityInfo.EntityName + "need primarykey", navEntityInfo.EntityName + " 需要主键");
if (navObjectNameColumnInfo.Navigat.Name2.HasValue())
{
navPkColumn = navEntityInfo.Columns.Where(it => it.PropertyName == navObjectNameColumnInfo.Navigat.Name2).FirstOrDefault();
}
}
public static List<ParameterExpression> ExpressionParameters(Expression expression) public static List<ParameterExpression> ExpressionParameters(Expression expression)
{ {
List<ParameterExpression> parameters = null; List<ParameterExpression> parameters = null;

View File

@ -3,6 +3,8 @@ using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Linq.Expressions; using System.Linq.Expressions;
using System.Text; using System.Text;
using System.Text.RegularExpressions;
namespace SqlSugar namespace SqlSugar
{ {
public class MemberExpressionResolve : BaseResolve public class MemberExpressionResolve : BaseResolve
@ -75,31 +77,39 @@ namespace SqlSugar
var navN = new OneToOneNavgateExpressionN(this.Context?.SugarContext?.Context); var navN = new OneToOneNavgateExpressionN(this.Context?.SugarContext?.Context);
if (nav.IsNavgate(expression)) if (nav.IsNavgate(expression))
{ {
var value = nav.GetSql(); if (this.Context?.SugarContext?.QueryBuilder?.JoinQueryInfos != null)
SetNavigateResult();
this.Context.SingleTableNameSubqueryShortName = nav.ShorName;
if (isSetTempData)
{ {
baseParameter.CommonTempData = value; var p=expression.Expression.ObjToString();
var querybuilder = this.Context?.SugarContext?.QueryBuilder;
var joinInfos = querybuilder.JoinQueryInfos;
var joinInfo=joinInfos.FirstOrDefault(it => $"{querybuilder.TableShortName}.{ it.ShortName.Replace("pnv_","")}" == p);
if (joinInfo != null)
{
var columnInfo=nav.ProPertyEntity.Columns.FirstOrDefault(it => it.PropertyName == nav.MemberName);
var value =new MapperSql() { Sql = joinInfo.ShortName + "." + columnInfo.DbColumnName };
if (isSetTempData)
{
baseParameter.CommonTempData = value;
}
else
{
AppendValue(parameter, isLeft, value);
}
}
else
{
DefaultOneToOne(parameter, baseParameter, isLeft, isSetTempData, nav);
}
} }
else else
{ {
AppendValue(parameter, isLeft, value); DefaultOneToOne(parameter, baseParameter, isLeft, isSetTempData, nav);
} }
} }
else if (navN.IsNavgate(expression)) else if (navN.IsNavgate(expression))
{ {
var value = navN.GetMemberSql(); DefaultOneToOneN(parameter, baseParameter, isLeft, isSetTempData, navN);
SetNavigateResult();
this.Context.SingleTableNameSubqueryShortName = navN.shorName;
if (isSetTempData)
{
baseParameter.CommonTempData = value;
}
else
{
AppendValue(parameter, isLeft, value);
}
} }
else else
{ {
@ -116,6 +126,36 @@ namespace SqlSugar
} }
} }
private void DefaultOneToOneN(ExpressionParameter parameter, ExpressionParameter baseParameter, bool? isLeft, bool isSetTempData, OneToOneNavgateExpressionN navN)
{
var value = navN.GetMemberSql();
SetNavigateResult();
this.Context.SingleTableNameSubqueryShortName = navN.shorName;
if (isSetTempData)
{
baseParameter.CommonTempData = value;
}
else
{
AppendValue(parameter, isLeft, value);
}
}
private void DefaultOneToOne(ExpressionParameter parameter, ExpressionParameter baseParameter, bool? isLeft, bool isSetTempData, OneToOneNavgateExpression nav)
{
var value = nav.GetSql();
SetNavigateResult();
this.Context.SingleTableNameSubqueryShortName = nav.ShorName;
if (isSetTempData)
{
baseParameter.CommonTempData = value;
}
else
{
AppendValue(parameter, isLeft, value);
}
}
private static bool IsConvertMemberName(MemberExpression expression) private static bool IsConvertMemberName(MemberExpression expression)
{ {
return expression.Expression is UnaryExpression && (expression.Expression as UnaryExpression).Operand is ParameterExpression; return expression.Expression is UnaryExpression && (expression.Expression as UnaryExpression).Operand is ParameterExpression;

View File

@ -10,11 +10,11 @@ namespace SqlSugar
internal class OneToOneNavgateExpression internal class OneToOneNavgateExpression
{ {
private SqlSugarProvider context; private SqlSugarProvider context;
private EntityInfo EntityInfo; internal EntityInfo EntityInfo;
private EntityInfo ProPertyEntity; internal EntityInfo ProPertyEntity;
private Navigate Navigat; private Navigate Navigat;
public string ShorName; public string ShorName;
private string MemberName; internal string MemberName;
public OneToOneNavgateExpression(SqlSugarProvider context) public OneToOneNavgateExpression(SqlSugarProvider context)
{ {
this.context = context; this.context = context;

View File

@ -19,6 +19,7 @@ namespace SqlSugar
ISugarQueryable<T> AS<T2>(string tableName); ISugarQueryable<T> AS<T2>(string tableName);
ISugarQueryable<T> AS(string tableName); ISugarQueryable<T> AS(string tableName);
ISugarQueryable<T> With(string withString); ISugarQueryable<T> With(string withString);
ISugarQueryable<T> IncludeLeftJoin(Expression<Func<T, object>> LeftObject);
ISugarQueryable<T, T2> LeftJoin<T2>(ISugarQueryable<T2> joinQueryable, Expression<Func<T, T2, bool>> joinExpression); ISugarQueryable<T, T2> LeftJoin<T2>(ISugarQueryable<T2> joinQueryable, Expression<Func<T, T2, bool>> joinExpression);
ISugarQueryable<T, T2> InnerJoin<T2>(ISugarQueryable<T2> joinQueryable, Expression<Func<T, T2, bool>> joinExpression); ISugarQueryable<T, T2> InnerJoin<T2>(ISugarQueryable<T2> joinQueryable, Expression<Func<T, T2, bool>> joinExpression);
ISugarQueryable<T, T2> RightJoin<T2>(ISugarQueryable<T2> joinQueryable, Expression<Func<T, T2, bool>> joinExpression); ISugarQueryable<T, T2> RightJoin<T2>(ISugarQueryable<T2> joinQueryable, Expression<Func<T, T2, bool>> joinExpression);