This commit is contained in:
sunkaixuan 2017-11-28 13:06:57 +08:00
parent 18ec8941de
commit c7d6bbabb5
2 changed files with 68 additions and 25 deletions

View File

@ -21,6 +21,7 @@ namespace OrmTest.UnitTest
base.Begin(); base.Begin();
for (int i = 0; i < base.Count; i++) for (int i = 0; i < base.Count; i++)
{ {
whereSingle28();
whereSingle27(); whereSingle27();
whereSingle26(); whereSingle26();
whereSingle25(); whereSingle25();
@ -55,6 +56,21 @@ namespace OrmTest.UnitTest
} }
base.End("Where Test"); base.End("Where Test");
} }
public string Get28(string a) {
return a + "1";
}
private void whereSingle28()
{
Expression<Func<Student, bool>> exp = it => Get28("22")=="22";
ExpressionContext expContext = new ExpressionContext();
expContext.Resolve(exp, ResolveExpressType.WhereMultiple);
var value = expContext.Result.GetString();
var pars = expContext.Parameters;
base.Check(value, pars, " (@constant0 = @Const1 )", new List<SugarParameter>() {
new SugarParameter("@constant0","221"),
new SugarParameter("@Const1","22")
}, "whereSingle28");
}
private void whereSingle27() { private void whereSingle27() {
var schoolData = new School() { Id = 100, Name = "x" }; var schoolData = new School() { Id = 100, Name = "x" };
Expression<Func<Student, bool>> exp = it => it.Name.Contains(schoolData.Name); Expression<Func<Student, bool>> exp = it => it.Name.Contains(schoolData.Name);

View File

@ -105,34 +105,61 @@ namespace SqlSugar
private void SqlFuncMethod(ExpressionParameter parameter, MethodCallExpression express, bool? isLeft) private void SqlFuncMethod(ExpressionParameter parameter, MethodCallExpression express, bool? isLeft)
{ {
if (!CheckMethod(express)) { if (!CheckMethod(express))
Check.Exception(true, string.Format(ErrorMessage.MethodError, express.Method.Name));
}
var method = express.Method;
string name = method.Name;
var args = express.Arguments.Cast<Expression>().ToList();
MethodCallExpressionModel model = new MethodCallExpressionModel();
model.Args = new List<MethodCallExpressionArgs>();
switch (this.Context.ResolveType)
{ {
case ResolveExpressType.WhereSingle: CusMethod(parameter, express, isLeft);
case ResolveExpressType.WhereMultiple: }
Check.Exception(name == "GetSelfAndAutoFill", "SqlFunc.GetSelfAndAutoFill can only be used in Select."); else
Where(parameter, isLeft, name, args, model); {
break; var method = express.Method;
case ResolveExpressType.SelectSingle: string name = method.Name;
case ResolveExpressType.SelectMultiple: var args = express.Arguments.Cast<Expression>().ToList();
case ResolveExpressType.Update: MethodCallExpressionModel model = new MethodCallExpressionModel();
Select(parameter, isLeft, name, args, model); model.Args = new List<MethodCallExpressionArgs>();
break; switch (this.Context.ResolveType)
case ResolveExpressType.FieldSingle: {
case ResolveExpressType.FieldMultiple: case ResolveExpressType.WhereSingle:
Field(parameter, isLeft, name, args, model); case ResolveExpressType.WhereMultiple:
break; Check.Exception(name == "GetSelfAndAutoFill", "SqlFunc.GetSelfAndAutoFill can only be used in Select.");
default: Where(parameter, isLeft, name, args, model);
break; break;
case ResolveExpressType.SelectSingle:
case ResolveExpressType.SelectMultiple:
case ResolveExpressType.Update:
Select(parameter, isLeft, name, args, model);
break;
case ResolveExpressType.FieldSingle:
case ResolveExpressType.FieldMultiple:
Field(parameter, isLeft, name, args, model);
break;
default:
break;
}
} }
} }
private void CusMethod(ExpressionParameter parameter, MethodCallExpression express, bool? isLeft)
{
try
{
var constValue = ExpressionTool.DynamicInvoke(express);
parameter.BaseParameter.CommonTempData = constValue;
var parameterName = base.AppendParameter(constValue);
if (parameter.BaseParameter.CommonTempData != null && parameter.BaseParameter.CommonTempData.Equals(CommonTempDataType.Result))
{
this.Context.Result.Append(parameterName);
}
else
{
base.AppendValue(parameter, isLeft, parameterName);
}
}
catch
{
Check.Exception(true, string.Format(ErrorMessage.MethodError, express.Method.Name));
}
}
private void NativeExtensionMethod(ExpressionParameter parameter, MethodCallExpression express, bool? isLeft, string name, List<MethodCallExpressionArgs> appendArgs = null) private void NativeExtensionMethod(ExpressionParameter parameter, MethodCallExpression express, bool? isLeft, string name, List<MethodCallExpressionArgs> appendArgs = null)
{ {
var method = express.Method; var method = express.Method;