This commit is contained in:
sunkaixuan
2017-09-16 21:27:31 +08:00
parent aac81db613
commit ed9884a5fa
7 changed files with 74 additions and 35 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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