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,21 +27,46 @@ namespace OrmTest.Demo
Enum();
Simple();
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()
{
var db = GetInstance();
var list= db.Queryable<Student>().Where(it => it.Id == 1).SingleAsync();
var list = db.Queryable<Student>().Where(it => it.Id == 1).SingleAsync();
list.Wait();
var list2 = db.Queryable<Student>().SingleAsync(it => it.Id == 1);
list2.Wait();
var list3= db.Queryable<Student>().Where(it => it.Id == 1).ToListAsync();
var list3 = db.Queryable<Student>().Where(it => it.Id == 1).ToListAsync();
list3.Wait();
var list4= db.Queryable<Student>().Where(it => it.Id == 1).ToPageListAsync(1,2);
var list4 = db.Queryable<Student>().Where(it => it.Id == 1).ToPageListAsync(1, 2);
list4.Wait();
}
@ -57,10 +82,10 @@ namespace OrmTest.Demo
sdb.DeleteById<Student>(1);
sdb.Insert(new Student() { Name = "xx" });
sdb.Update<Student>(it => new Student { Name = "newvalue" }, it => it.Id == 1);//only update name where id=1
sdb.Update(new Student() { Name="newavalue" ,Id=1});//update all where id=1
sdb.Update(new Student() { Name = "newavalue", Id = 1 });//update all where id=1
//SimpleClient Get SqlSugarClient
var student3=sdb.FullClient.Queryable<Student>().InSingle(1);
var student3 = sdb.FullClient.Queryable<Student>().InSingle(1);
}
@ -95,22 +120,22 @@ namespace OrmTest.Demo
//3
var dt=db.Ado.UseStoredProcedure().GetDataTable("sp_school", new { p1 = 1, p2 = 2 });
var dt = db.Ado.UseStoredProcedure().GetDataTable("sp_school", new { p1 = 1, p2 = 2 });
var p11 = new SugarParameter("@p1", "1");
var p22 = new SugarParameter("@p2", null, true);//isOutput=true
//4
var dt2 = db.Ado.UseStoredProcedure().SqlQuery<School>("sp_school",p11,p22);
var dt2 = db.Ado.UseStoredProcedure().SqlQuery<School>("sp_school", p11, p22);
}
private static void Tran()
{
var db = GetInstance();
var x=db.Insertable(new Student() { CreateTime = DateTime.Now, Name = "tran" }).ExecuteCommand();
var x = db.Insertable(new Student() { CreateTime = DateTime.Now, Name = "tran" }).ExecuteCommand();
//1. no result
var result = db.Ado.UseTran(() =>
{
var beginCount = db.Queryable<Student>().ToList();
db.Ado.ExecuteCommand("delete student");
var endCount = db.Queryable<Student>().Count();
@ -161,7 +186,7 @@ namespace OrmTest.Demo
int count = 0;
var list4 = db.Queryable<Student, School>((st, sc) => st.SchoolId == sc.Id)
.PartitionBy(st => new { st.Name }).Take(2).OrderBy(st => st.Id,OrderByType.Desc).Select(st => st).ToPageList(1, 1000, ref count);
.PartitionBy(st => new { st.Name }).Take(2).OrderBy(st => st.Id, OrderByType.Desc).Select(st => st).ToPageList(1, 1000, ref count);
//SqlFunc.AggregateSum(object thisValue)
//SqlFunc.AggregateAvg<TResult>(TResult thisValue)
@ -184,24 +209,21 @@ namespace OrmTest.Demo
public static void Easy()
{
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 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 getNew = db.Queryable<Student>().Where(it => it.Id == 1).Select(it => new { id = SqlFunc.IIF(it.Id == 0, 1, it.Id), it.Name, it.SchoolId }).ToList();
var getAllNoLock = db.Queryable<Student>().With(SqlWith.NoLock).ToList();
var getByPrimaryKey = db.Queryable<Student>().InSingle(2);
var getSingleOrDefault = db.Queryable<Student>().Where(it=>it.Id==1).Single();
var getSingleOrDefault = db.Queryable<Student>().Where(it => it.Id == 1).Single();
var getFirstOrDefault = db.Queryable<Student>().First();
var getByWhere = db.Queryable<Student>().Where(it => it.Id == 1 || it.Name == "a").ToList();
var getByFuns = db.Queryable<Student>().Where(it => SqlFunc.IsNullOrEmpty(it.Name)).ToList();
var sum = db.Queryable<Student>().Select(it => it.SchoolId).ToList();
var sum2 = db.Queryable<Student,School>((st,sc)=>st.SchoolId==sc.Id).Sum((st,sc) => sc.Id);
var sum2 = db.Queryable<Student, School>((st, sc) => st.SchoolId == sc.Id).Sum((st, sc) => sc.Id);
var isAny = db.Queryable<Student>().Where(it => it.Id == -1).Any();
var isAny2 = db.Queryable<Student>().Any(it => it.Id == -1);
var count = db.Queryable<Student>().Count(it => it.Id >0);
var count = db.Queryable<Student>().Count(it => it.Id > 0);
var date = db.Queryable<Student>().Where(it => it.CreateTime.Value.Date == DateTime.Now.Date).ToList();
var getListByRename = db.Queryable<School>().AS("Student").ToList();
var in1 = db.Queryable<Student>().In(it => it.Id, new int[] { 1, 2, 3 }).ToList();
@ -218,9 +240,9 @@ namespace OrmTest.Demo
var joinSql = db.Queryable("student", "s").OrderBy("id").Select("id,name").ToPageList(1, 2);
var getDay1List = db.Queryable<Student>().Where(it=>it.CreateTime.Value.Hour==1).ToList();
var getDateAdd = db.Queryable<Student>().Where(it => it.CreateTime.Value.AddDays(1)==DateTime.Now).ToList();
var getDateIsSame= db.Queryable<Student>().Where(it => SqlFunc.DateIsSame(DateTime.Now,DateTime.Now,DateType.Hour)).ToList();
var getDay1List = db.Queryable<Student>().Where(it => it.CreateTime.Value.Hour == 1).ToList();
var getDateAdd = db.Queryable<Student>().Where(it => it.CreateTime.Value.AddDays(1) == DateTime.Now).ToList();
var getDateIsSame = db.Queryable<Student>().Where(it => SqlFunc.DateIsSame(DateTime.Now, DateTime.Now, DateType.Hour)).ToList();
var getSqlList = db.Queryable<Student>().AS("(select * from student) t").ToList();
@ -229,7 +251,7 @@ namespace OrmTest.Demo
var getUnionAllList2 = db.UnionAll(db.Queryable<Student>(), db.Queryable<Student>()).ToList();
var test1 = db.Queryable<Student, School>((st, sc) => st.SchoolId == sc.Id).Select((st, sc) =>SqlFunc.ToInt64(sc.Id)).ToList();
var test1 = db.Queryable<Student, School>((st, sc) => st.SchoolId == sc.Id).Select((st, sc) => SqlFunc.ToInt64(sc.Id)).ToList();
}
public static void Page()
{
@ -287,7 +309,7 @@ namespace OrmTest.Demo
var list4 = db.Queryable<Student, School>((st, sc) => new object[] {
JoinType.Left,st.SchoolId==sc.Id
})
.Select((st, sc) => new { id=st.Id,school=sc }).ToList();
.Select((st, sc) => new { id = st.Id, school = sc }).ToList();
var list5 = db.Queryable<Student, School>((st, sc) => new object[] {
@ -338,39 +360,39 @@ namespace OrmTest.Demo
//The simple use of Join 2 table
var list5 = db.Queryable<Student, School>((st, sc) => st.SchoolId == sc.Id).Select((st,sc)=>new {st.Name,st.Id,schoolName=sc.Name}).ToList();
var list5 = db.Queryable<Student, School>((st, sc) => st.SchoolId == sc.Id).Select((st, sc) => new { st.Name, st.Id, schoolName = sc.Name }).ToList();
//join 3 table
var list6 = db.Queryable<Student, School,School>((st, sc,sc2) => st.SchoolId == sc.Id&&sc.Id==sc2.Id)
.Select((st, sc,sc2) => new { st.Name, st.Id, schoolName = sc.Name,schoolName2=sc2.Name }).ToList();
var list6 = db.Queryable<Student, School, School>((st, sc, sc2) => st.SchoolId == sc.Id && sc.Id == sc2.Id)
.Select((st, sc, sc2) => new { st.Name, st.Id, schoolName = sc.Name, schoolName2 = sc2.Name }).ToList();
//join 3 table page
var list7= db.Queryable<Student, School, School>((st, sc, sc2) => st.SchoolId == sc.Id && sc.Id == sc2.Id)
.Select((st, sc, sc2) => new { st.Name, st.Id, schoolName = sc.Name, schoolName2 = sc2.Name }).ToPageList(1,2);
var list7 = db.Queryable<Student, School, School>((st, sc, sc2) => st.SchoolId == sc.Id && sc.Id == sc2.Id)
.Select((st, sc, sc2) => new { st.Name, st.Id, schoolName = sc.Name, schoolName2 = sc2.Name }).ToPageList(1, 2);
//join 3 table page
var list8 = db.Queryable<Student, School, School>((st, sc, sc2) => st.SchoolId == sc.Id && sc.Id == sc2.Id)
.OrderBy(st=>st.Id)
.OrderBy(st => st.Id)
.Select((st, sc, sc2) => new { st.Name, st.Id, schoolName = sc.Name, schoolName2 = sc2.Name }).ToPageList(1, 2);
//In
var list9 = db.Queryable<Student>("it")
.OrderBy(it => it.Id)
.In(it => it.Id,db.Queryable<School>().Where("it.id=schoolId").Select(it=>it.Id))
.In(it => it.Id, db.Queryable<School>().Where("it.id=schoolId").Select(it => it.Id))
.ToList();
//SELECT [ID],[SchoolId],[Name],[CreateTime] FROM [STudent] it WHERE [ID]
//IN (SELECT [Id] FROM [School] WHERE it.id=schoolId ) ORDER BY [ID] ASC
var list10 = db.Queryable<Student,School>((st,sc)=>st.SchoolId==sc.Id)
var list10 = db.Queryable<Student, School>((st, sc) => st.SchoolId == sc.Id)
.In(st => st.Name, db.Queryable<School>("sc2").Where("id=st.schoolid").Select(it => it.Name))
.OrderBy(st => st.Id)
.Select(st=>st)
.Select(st => st)
.ToList();
//SELECT st.* FROM [STudent] st ,[School] sc WHERE ( [st].[SchoolId] = [sc].[Id] ) AND [st].[Name]
//IN (SELECT [Name] FROM [School] sc2 WHERE id=st.schoolid ) ORDER BY [st].[ID] ASC
var list11 = db.Queryable<Student, School>((st, sc) => st.SchoolId == sc.Id)
.In(st => st.Name, db.Queryable<School>("sc2").Where(it=>it.Id==1).Where("id=st.schoolid").Select(it => it.Name))
.In(st => st.Name, db.Queryable<School>("sc2").Where(it => it.Id == 1).Where("id=st.schoolid").Select(it => it.Name))
.OrderBy(st => st.Id)
.Select(st => st)
.ToList();
@ -418,7 +440,7 @@ namespace OrmTest.Demo
{
var db = GetInstance();
db.IgnoreColumns.Add("TestId", "Student");
var s1 = db.Queryable<Student>().Where(it=>it.Id== 136915).Single();
var s1 = db.Queryable<Student>().Where(it => it.Id == 136915).Single();
var s2 = db.Queryable<Student>().Select(it => new { id = it.Id, w = new { x = it } }).ToList();
var s3 = db.Queryable<Student>().Select(it => new { newid = it.Id }).ToList();
var s4 = db.Queryable<Student>().Select(it => new { newid = it.Id, obj = it }).ToList();

View File

@ -219,6 +219,11 @@ namespace SqlSugar
resolveExpress.Resolve(expression, resolveType);
this.Parameters.AddRange(resolveExpress.Parameters);
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;
}
public virtual string ToSqlString()

View File

@ -37,6 +37,7 @@ namespace SqlSugar
}
public int Index { get; set; }
public int ParameterIndex { get; set; }
public string SingleTableNameSubqueryShortName{ get; set; }
public MappingColumnList MappingColumns { get; set; }
public MappingTableList MappingTables { get; set; }
public IgnoreColumnList IgnoreComumnList { get; set; }

View File

@ -42,7 +42,8 @@ namespace SqlSugar
}
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();
base.AppendValue(parameter, isLeft, appendSql);
return;

View File

@ -29,7 +29,11 @@ namespace SqlSugar.ExpressionsToSql.Subquery
public string GetValue(ExpressionContext context, Expression expression)
{
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>();
private ExpressionContext context = null;
public SubResolve(MethodCallExpression expression, ExpressionContext context)
public SubResolve(MethodCallExpression expression, ExpressionContext context,Expression oppsiteExpression)
{
this.context = context;
var currentExpression = expression;
allMethods.Add(currentExpression);
if (context.IsSingle) {
var childExpression = (oppsiteExpression as MemberExpression).Expression;
this.context.SingleTableNameSubqueryShortName = (childExpression as ParameterExpression).Name;
}
while (currentExpression != null)
{
var addItem = currentExpression.Object as MethodCallExpression;

View File

@ -21,6 +21,8 @@ namespace SqlSugar
List<SugarParameter> Parameters { get; set; }
ExpressionResult Result { get; set; }
string SqlParameterKeyWord { get; }
string SingleTableNameSubqueryShortName { get; set; }
string GetAsString(string fieldName, string fieldValue);
void Resolve(Expression expression, ResolveExpressType resolveType);
void Clear();