mirror of
https://gitee.com/dotnetchina/SqlSugar.git
synced 2025-09-20 10:38:09 +08:00
Subquery
This commit is contained in:
@@ -27,6 +27,31 @@ namespace OrmTest.Demo
|
|||||||
Enum();
|
Enum();
|
||||||
Simple();
|
Simple();
|
||||||
Async();
|
Async();
|
||||||
|
Subqueryable();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void Subqueryable()
|
||||||
|
{
|
||||||
|
var db = GetInstance();
|
||||||
|
var getAll1 = db.Queryable<Student>()
|
||||||
|
.Where(it => it.Id == SqlFunc.Subqueryable<School>().Where(s => s.Id == it.Id).Select(s => s.Id))
|
||||||
|
.ToList();
|
||||||
|
|
||||||
|
var getAll2 = db.Queryable<Student, School>((st, sc) => new object[] {
|
||||||
|
JoinType.Left,st.Id==sc.Id
|
||||||
|
})
|
||||||
|
.Where(st => st.Id == SqlFunc.Subqueryable<School>().Where(s => s.Id == st.Id).Select(s => s.Id))
|
||||||
|
.ToList();
|
||||||
|
|
||||||
|
var getAll3 = db.Queryable<Student, School>((st, sc) => new object[] {
|
||||||
|
JoinType.Left,st.Id==sc.Id
|
||||||
|
})
|
||||||
|
.Select(st=>
|
||||||
|
new {
|
||||||
|
name=st.Name,
|
||||||
|
id = SqlFunc.Subqueryable<School>().Where(s => s.Id == st.Id).Select(s => s.Id)
|
||||||
|
})
|
||||||
|
.ToList();
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void Async()
|
private static void Async()
|
||||||
@@ -184,9 +209,6 @@ namespace OrmTest.Demo
|
|||||||
public static void Easy()
|
public static void Easy()
|
||||||
{
|
{
|
||||||
var db = GetInstance();
|
var db = GetInstance();
|
||||||
var getAll2 = db.Queryable<Student>()
|
|
||||||
.Where(it => it.Id == SqlFunc.Subqueryable<School>().Where(s => s.Id == it.Id).Select(s => s.Id))
|
|
||||||
.ToList();
|
|
||||||
var getAll = db.Queryable<Student>().ToList();
|
var getAll = db.Queryable<Student>().ToList();
|
||||||
var getAllOrder = db.Queryable<Student>().OrderBy(it => it.Id).OrderBy(it => it.Name, OrderByType.Desc).ToList();
|
var getAllOrder = db.Queryable<Student>().OrderBy(it => it.Id).OrderBy(it => it.Name, OrderByType.Desc).ToList();
|
||||||
var getId = db.Queryable<Student>().Select(it => it.Id).ToList();
|
var getId = db.Queryable<Student>().Select(it => it.Id).ToList();
|
||||||
|
@@ -219,6 +219,11 @@ namespace SqlSugar
|
|||||||
resolveExpress.Resolve(expression, resolveType);
|
resolveExpress.Resolve(expression, resolveType);
|
||||||
this.Parameters.AddRange(resolveExpress.Parameters);
|
this.Parameters.AddRange(resolveExpress.Parameters);
|
||||||
var reval = resolveExpress.Result;
|
var reval = resolveExpress.Result;
|
||||||
|
var isSingleTableHasSubquery = IsSingle() && resolveExpress.SingleTableNameSubqueryShortName.IsValuable();
|
||||||
|
if (isSingleTableHasSubquery) {
|
||||||
|
Check.Exception(!string.IsNullOrEmpty(this.TableShortName) && resolveExpress.SingleTableNameSubqueryShortName != this.TableShortName, "{0} and {1} need same name");
|
||||||
|
this.TableShortName = resolveExpress.SingleTableNameSubqueryShortName;
|
||||||
|
}
|
||||||
return reval;
|
return reval;
|
||||||
}
|
}
|
||||||
public virtual string ToSqlString()
|
public virtual string ToSqlString()
|
||||||
|
@@ -37,6 +37,7 @@ namespace SqlSugar
|
|||||||
}
|
}
|
||||||
public int Index { get; set; }
|
public int Index { get; set; }
|
||||||
public int ParameterIndex { get; set; }
|
public int ParameterIndex { get; set; }
|
||||||
|
public string SingleTableNameSubqueryShortName{ get; set; }
|
||||||
public MappingColumnList MappingColumns { get; set; }
|
public MappingColumnList MappingColumns { get; set; }
|
||||||
public MappingTableList MappingTables { get; set; }
|
public MappingTableList MappingTables { get; set; }
|
||||||
public IgnoreColumnList IgnoreComumnList { get; set; }
|
public IgnoreColumnList IgnoreComumnList { get; set; }
|
||||||
|
@@ -42,7 +42,8 @@ namespace SqlSugar
|
|||||||
}
|
}
|
||||||
else if (IsSubMethod(express, methodName))
|
else if (IsSubMethod(express, methodName))
|
||||||
{
|
{
|
||||||
SubResolve subResolve = new SubResolve(express, this.Context);
|
Check.Exception(!(parameter.BaseExpression is BinaryExpression), "Current expressions are not supported");
|
||||||
|
SubResolve subResolve = new SubResolve(express, this.Context,parameter.OppsiteExpression);
|
||||||
var appendSql = subResolve.GetSql();
|
var appendSql = subResolve.GetSql();
|
||||||
base.AppendValue(parameter, isLeft, appendSql);
|
base.AppendValue(parameter, isLeft, appendSql);
|
||||||
return;
|
return;
|
||||||
|
@@ -29,7 +29,11 @@ namespace SqlSugar.ExpressionsToSql.Subquery
|
|||||||
public string GetValue(ExpressionContext context, Expression expression)
|
public string GetValue(ExpressionContext context, Expression expression)
|
||||||
{
|
{
|
||||||
var exp = expression as MethodCallExpression;
|
var exp = expression as MethodCallExpression;
|
||||||
return "WHERE "+SubTools.GetMethodValue(context, exp.Arguments[0], ResolveExpressType.WhereMultiple);
|
var argExp= exp.Arguments[0];
|
||||||
|
var result= "WHERE "+SubTools.GetMethodValue(context, argExp, ResolveExpressType.WhereMultiple);
|
||||||
|
var selfParameterName =context.GetTranslationColumnName((argExp as LambdaExpression).Parameters.First().Name)+UtilConstants.Dot;
|
||||||
|
result = result.Replace(selfParameterName,string.Empty);
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -10,11 +10,15 @@ namespace SqlSugar
|
|||||||
{
|
{
|
||||||
List<MethodCallExpression> allMethods = new List<MethodCallExpression>();
|
List<MethodCallExpression> allMethods = new List<MethodCallExpression>();
|
||||||
private ExpressionContext context = null;
|
private ExpressionContext context = null;
|
||||||
public SubResolve(MethodCallExpression expression, ExpressionContext context)
|
public SubResolve(MethodCallExpression expression, ExpressionContext context,Expression oppsiteExpression)
|
||||||
{
|
{
|
||||||
this.context = context;
|
this.context = context;
|
||||||
var currentExpression = expression;
|
var currentExpression = expression;
|
||||||
allMethods.Add(currentExpression);
|
allMethods.Add(currentExpression);
|
||||||
|
if (context.IsSingle) {
|
||||||
|
var childExpression = (oppsiteExpression as MemberExpression).Expression;
|
||||||
|
this.context.SingleTableNameSubqueryShortName = (childExpression as ParameterExpression).Name;
|
||||||
|
}
|
||||||
while (currentExpression != null)
|
while (currentExpression != null)
|
||||||
{
|
{
|
||||||
var addItem = currentExpression.Object as MethodCallExpression;
|
var addItem = currentExpression.Object as MethodCallExpression;
|
||||||
|
@@ -21,6 +21,8 @@ namespace SqlSugar
|
|||||||
List<SugarParameter> Parameters { get; set; }
|
List<SugarParameter> Parameters { get; set; }
|
||||||
ExpressionResult Result { get; set; }
|
ExpressionResult Result { get; set; }
|
||||||
string SqlParameterKeyWord { get; }
|
string SqlParameterKeyWord { get; }
|
||||||
|
string SingleTableNameSubqueryShortName { get; set; }
|
||||||
|
|
||||||
string GetAsString(string fieldName, string fieldValue);
|
string GetAsString(string fieldName, string fieldValue);
|
||||||
void Resolve(Expression expression, ResolveExpressType resolveType);
|
void Resolve(Expression expression, ResolveExpressType resolveType);
|
||||||
void Clear();
|
void Clear();
|
||||||
|
Reference in New Issue
Block a user