Rich query

This commit is contained in:
sunkaixuan 2017-11-09 10:26:03 +08:00
parent 8484b4202d
commit 504b24be3d
9 changed files with 88 additions and 2 deletions

View File

@ -284,6 +284,12 @@ namespace OrmTest.Demo
var getUnionAllList2 = db.UnionAll(db.Queryable<Student>(), db.Queryable<Student>()).ToList(); var getUnionAllList2 = db.UnionAll(db.Queryable<Student>(), db.Queryable<Student>()).ToList();
var test1 = db.Queryable<Student, School>((st, sc) => st.SchoolId == sc.Id).Where(st=>st.CreateTime>SqlFunc.GetDate()).Select((st, sc) => SqlFunc.ToInt64(sc.Id)).ToList(); var test1 = db.Queryable<Student, School>((st, sc) => st.SchoolId == sc.Id).Where(st=>st.CreateTime>SqlFunc.GetDate()).Select((st, sc) => SqlFunc.ToInt64(sc.Id)).ToList();
//var test2= db.Queryable<Student, School>((st, sc) => st.SchoolId == sc.Id)
// .Where(st=>
// SqlFunc.IF(st.Id>1)
// .Return(st.Id)
// .ElseIF(st.Id==1)
// .Return(st.SchoolId).End(st.Id)==1).ToList();
} }
public static void Page() public static void Page()
{ {

View File

@ -40,6 +40,10 @@ namespace OrmTest.Demo
List<ConditionalModel> conModels = new List<ConditionalModel>(); List<ConditionalModel> conModels = new List<ConditionalModel>();
conModels.Add(new ConditionalModel() { FieldName = "id", ConditionalType = ConditionalType.Equal, FieldValue = "1" }); conModels.Add(new ConditionalModel() { FieldName = "id", ConditionalType = ConditionalType.Equal, FieldValue = "1" });
conModels.Add(new ConditionalModel() { FieldName = "id", ConditionalType = ConditionalType.Like, FieldValue = "1" }); conModels.Add(new ConditionalModel() { FieldName = "id", ConditionalType = ConditionalType.Like, FieldValue = "1" });
conModels.Add(new ConditionalModel() { FieldName = "id", ConditionalType = ConditionalType.IsNullOrEmpty });
conModels.Add(new ConditionalModel() { FieldName = "id", ConditionalType = ConditionalType.In,FieldValue="1,2,3" });
conModels.Add(new ConditionalModel() { FieldName = "id", ConditionalType = ConditionalType.NotIn, FieldValue = "1,2,3" });
conModels.Add(new ConditionalModel() { FieldName = "id", ConditionalType = ConditionalType.NoEqual, FieldValue = "1,2,3" });
var student = db.Queryable<Student>().Where(conModels).ToList(); var student = db.Queryable<Student>().Where(conModels).ToList();
} }

View File

@ -12,6 +12,12 @@ namespace SqlSugar
GreaterThan =2, GreaterThan =2,
GreaterThanOrEqual = 3, GreaterThanOrEqual = 3,
LessThan=4, LessThan=4,
LessThanOrEqual = 5 LessThanOrEqual = 5,
In=6,
NotIn=7,
LikeLeft=8,
LikeRight=9,
NoEqual=10,
IsNullOrEmpty=11
} }
} }

View File

@ -0,0 +1,28 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
namespace SqlSugar
{
public class CaseWhen
{
public CaseThen ElseIF(bool condition)
{
return null;
}
public T End<T>(T defaultValue)
{
return default(T);
}
}
public class CaseThen
{
public CaseWhen Return<T>(T result)
{
return null;
}
}
}

View File

@ -34,7 +34,7 @@ namespace SqlSugar
{ {
get get
{ {
return ErrorMessage.GetThrowMessage("Connection open error . {0}", " 连接字符串出错了实在找不到原因请先Google错误{0}."); return ErrorMessage.GetThrowMessage("Connection open error . {0}", " 连接数据库过程中发生错误检查服务器是否正常连接字符串是否正确实在找不到原因请先Google错误信息{0}.");
} }
} }
} }

View File

@ -116,5 +116,6 @@ namespace SqlSugar
/// <typeparam name="T"></typeparam> /// <typeparam name="T"></typeparam>
/// <returns></returns> /// <returns></returns>
public static Subqueryable<T> Subqueryable<T>() where T:class,new(){ throw new NotSupportedException("Can only be used in expressions");} public static Subqueryable<T> Subqueryable<T>() where T:class,new(){ throw new NotSupportedException("Can only be used in expressions");}
public static CaseThen IF(bool condition) { throw new NotSupportedException("Can only be used in expressions"); }
} }
} }

View File

@ -55,6 +55,10 @@ namespace SqlSugar
} }
return; return;
} }
else if (IsIfElse(express, methodName)) {
List<Expression> expList = new List<Expression>();
return;
}
if (IsContainsArray(express, methodName, isValidNativeMethod)) if (IsContainsArray(express, methodName, isValidNativeMethod))
{ {
methodName = "ContainsArray"; methodName = "ContainsArray";
@ -70,6 +74,14 @@ namespace SqlSugar
} }
} }
private bool IsIfElse(MethodCallExpression express, string methodName)
{
if (methodName == "End"&& express.Object.Type==typeof(CaseWhen))
return true;
else
return false;
}
private void SqlFuncMethod(ExpressionParameter parameter, MethodCallExpression express, bool? isLeft) private void SqlFuncMethod(ExpressionParameter parameter, MethodCallExpression express, bool? isLeft)
{ {
CheckMethod(express); CheckMethod(express);

View File

@ -330,6 +330,34 @@ namespace SqlSugar
builder.AppendFormat(temp, type, item.FieldName.ToSqlFilter(), "<=", parameterName); builder.AppendFormat(temp, type, item.FieldName.ToSqlFilter(), "<=", parameterName);
parameters.Add(new SugarParameter(parameterName, item.FieldValue)); parameters.Add(new SugarParameter(parameterName, item.FieldValue));
break; break;
case ConditionalType.In:
if (item.FieldValue == null) item.FieldValue = string.Empty;
var inValue1 = ("("+item.FieldValue.Split(',').ToJoinSqlInVals()+")");
builder.AppendFormat(temp, type, item.FieldName.ToSqlFilter(), "IN", inValue1);
parameters.Add(new SugarParameter(parameterName, item.FieldValue));
break;
case ConditionalType.NotIn:
if (item.FieldValue == null) item.FieldValue = string.Empty;
var inValue2 = ("(" + item.FieldValue.Split(',').ToJoinSqlInVals() + ")");
builder.AppendFormat(temp, type, item.FieldName.ToSqlFilter(), "NOT IN", inValue2);
parameters.Add(new SugarParameter(parameterName, item.FieldValue));
break;
case ConditionalType.LikeLeft:
builder.AppendFormat(temp, type, item.FieldName.ToSqlFilter(), "LIKE", parameterName);
parameters.Add(new SugarParameter(parameterName,item.FieldValue + "%"));
break;
case ConditionalType.LikeRight:
builder.AppendFormat(temp, type, item.FieldName.ToSqlFilter(), "LIKE", parameterName);
parameters.Add(new SugarParameter(parameterName, "%"+item.FieldValue));
break;
case ConditionalType.NoEqual:
builder.AppendFormat(temp, type, item.FieldName.ToSqlFilter(), "<>", parameterName);
parameters.Add(new SugarParameter(parameterName, item.FieldValue));
break;
case ConditionalType.IsNullOrEmpty:
builder.AppendFormat("{0} ({1}) OR ({2}) ", type, item.FieldName.ToSqlFilter()+" IS NULL ", item.FieldName.ToSqlFilter()+" = '' ");
parameters.Add(new SugarParameter(parameterName, item.FieldValue));
break;
default: default:
break; break;
} }

View File

@ -80,6 +80,7 @@
<Compile Include="Entities\SlaveConnectionConfig.cs" /> <Compile Include="Entities\SlaveConnectionConfig.cs" />
<Compile Include="Enum\ConditionalType.cs" /> <Compile Include="Enum\ConditionalType.cs" />
<Compile Include="Enum\DbType.cs" /> <Compile Include="Enum\DbType.cs" />
<Compile Include="ExpressionsToSql\CaseWhen\CaseWhen.cs" />
<Compile Include="ExpressionsToSql\Subquery\Items\ISubOperation.cs" /> <Compile Include="ExpressionsToSql\Subquery\Items\ISubOperation.cs" />
<Compile Include="ExpressionsToSql\Subquery\Items\SubAnd.cs" /> <Compile Include="ExpressionsToSql\Subquery\Items\SubAnd.cs" />
<Compile Include="ExpressionsToSql\Subquery\Items\SubCount.cs" /> <Compile Include="ExpressionsToSql\Subquery\Items\SubCount.cs" />