mirror of
https://gitee.com/dotnetchina/SqlSugar.git
synced 2025-08-24 16:18:47 +08:00
-
This commit is contained in:
parent
c939074a2e
commit
1b42ff5ce9
Binary file not shown.
@ -14,10 +14,12 @@ namespace OrmTest
|
|||||||
|
|
||||||
class Program
|
class Program
|
||||||
{
|
{
|
||||||
|
public string id { get; set;}
|
||||||
static void Main(string[] args)
|
static void Main(string[] args)
|
||||||
{
|
{
|
||||||
string id = "1";
|
|
||||||
Expression<Func<Student, bool>> exp = it => it.Name!=id;
|
string x = "1";
|
||||||
|
Expression<Func<Student, bool>> exp = it => it.Name!=x;
|
||||||
// Expression<Func<Student, object>> exp = it => it.Name;
|
// Expression<Func<Student, object>> exp = it => it.Name;
|
||||||
ExpressionContext expContext = new ExpressionContext(exp, ResolveExpressType.Single);
|
ExpressionContext expContext = new ExpressionContext(exp, ResolveExpressType.Single);
|
||||||
// var x = expContext.GetFiledName();
|
// var x = expContext.GetFiledName();
|
||||||
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -61,8 +61,11 @@ namespace SqlSugar
|
|||||||
}
|
}
|
||||||
else if (exp is MemberExpression&&((MemberExpression)exp).Expression.NodeType== ExpressionType.Constant)
|
else if (exp is MemberExpression&&((MemberExpression)exp).Expression.NodeType== ExpressionType.Constant)
|
||||||
{
|
{
|
||||||
parameter.Expression = ((MemberExpression)exp).Expression;
|
return new MemberConstExpressionResolve(parameter);
|
||||||
return new ConstantExpressionResolve(parameter);
|
}
|
||||||
|
else if (exp is MemberExpression && ((MemberExpression)exp).Expression.NodeType == ExpressionType.New)
|
||||||
|
{
|
||||||
|
return new MemberNewExpressionResolve(parameter);
|
||||||
}
|
}
|
||||||
else if (exp is ConstantExpression)
|
else if (exp is ConstantExpression)
|
||||||
{
|
{
|
||||||
|
@ -29,105 +29,5 @@ namespace SqlSugar
|
|||||||
base.Context.SqlWhere.Append(value);
|
base.Context.SqlWhere.Append(value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//private object GetValue(MemberInfo member, Expression expression)
|
|
||||||
//{
|
|
||||||
// var memberInfos = new Stack<MemberInfo>();
|
|
||||||
// var fieldInfo = member as System.Reflection.FieldInfo;
|
|
||||||
// object dynInv = null;
|
|
||||||
// // "descend" toward's the root object reference:
|
|
||||||
// while (expression is MemberExpression)
|
|
||||||
// {
|
|
||||||
// var memberExpr = expression as MemberExpression;
|
|
||||||
// memberInfos.Push(memberExpr.Member);
|
|
||||||
// if (memberExpr.Expression == null)
|
|
||||||
// {
|
|
||||||
// if (memberExpr.Member.MemberType == MemberTypes.Property)
|
|
||||||
// {
|
|
||||||
// PropertyInfo pro = (PropertyInfo)memberExpr.Member;
|
|
||||||
// dynInv = pro.GetValue(memberExpr.Member, null);
|
|
||||||
// if (dynInv != null && dynInv.GetType().IsClass)
|
|
||||||
// {
|
|
||||||
// var fieldName = memberExpr.Member.Name;
|
|
||||||
// var proInfo = dynInv.GetType().GetProperty(fieldName);
|
|
||||||
// if (proInfo != null)
|
|
||||||
// {
|
|
||||||
// dynInv = proInfo.GetValue(dynInv, null);
|
|
||||||
// }
|
|
||||||
// var fieInfo = dynInv.GetType().GetField(fieldName);
|
|
||||||
// if (fieInfo != null)
|
|
||||||
// {
|
|
||||||
// dynInv = fieInfo.GetValue(dynInv);
|
|
||||||
// }
|
|
||||||
// if (fieInfo == null && proInfo == null)
|
|
||||||
// {
|
|
||||||
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// else if (memberExpr.Member.MemberType == MemberTypes.Field)
|
|
||||||
// {
|
|
||||||
// FieldInfo field = (FieldInfo)memberExpr.Member;
|
|
||||||
// dynInv = field.GetValue(memberExpr.Member);
|
|
||||||
// if (dynInv != null && dynInv.GetType().IsClass && dynInv.GetType() != ExpressionConst.StringType)
|
|
||||||
// {
|
|
||||||
// var fieldName = memberExpr.Member.Name;
|
|
||||||
// var proInfo = dynInv.GetType().GetProperty(fieldName);
|
|
||||||
// if (proInfo != null)
|
|
||||||
// {
|
|
||||||
// dynInv = proInfo.GetValue(dynInv, null);
|
|
||||||
// }
|
|
||||||
// var fieInfo = dynInv.GetType().GetField(fieldName);
|
|
||||||
// if (fieInfo != null)
|
|
||||||
// {
|
|
||||||
// dynInv = fieInfo.GetValue(dynInv);
|
|
||||||
// }
|
|
||||||
// if (fieInfo == null && proInfo == null)
|
|
||||||
// {
|
|
||||||
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// if (memberExpr.Expression == null)
|
|
||||||
// {
|
|
||||||
|
|
||||||
// }
|
|
||||||
// expression = memberExpr.Expression;
|
|
||||||
// }
|
|
||||||
|
|
||||||
// // fetch the root object reference:
|
|
||||||
// var constExpr = expression as ConstantExpression;
|
|
||||||
// if (constExpr == null)
|
|
||||||
// {
|
|
||||||
|
|
||||||
// }
|
|
||||||
// var objReference = constExpr.Value;
|
|
||||||
|
|
||||||
// // "ascend" back whence we came from and resolve object references along the way:
|
|
||||||
// while (memberInfos.Count > 0) // or some other break condition
|
|
||||||
// {
|
|
||||||
// var mi = memberInfos.Pop();
|
|
||||||
// if (mi.MemberType == MemberTypes.Property)
|
|
||||||
// {
|
|
||||||
// var objProp = objReference.GetType().GetProperty(mi.Name);
|
|
||||||
// if (objProp == null)
|
|
||||||
// {
|
|
||||||
|
|
||||||
// }
|
|
||||||
// objReference = objProp.GetValue(objReference, null);
|
|
||||||
// }
|
|
||||||
// else if (mi.MemberType == MemberTypes.Field)
|
|
||||||
// {
|
|
||||||
// var objField = objReference.GetType().GetField(mi.Name);
|
|
||||||
// if (objField == null)
|
|
||||||
// {
|
|
||||||
|
|
||||||
// }
|
|
||||||
// objReference = objField.GetValue(objReference);
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// return dynInv;
|
|
||||||
//}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,152 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Linq.Expressions;
|
||||||
|
using System.Reflection;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace SqlSugar
|
||||||
|
{
|
||||||
|
public class MemberConstExpressionResolve : BaseResolve
|
||||||
|
{
|
||||||
|
public MemberConstExpressionResolve(ExpressionParameter parameter) : base(parameter)
|
||||||
|
{
|
||||||
|
var expression = base.Expression as MemberExpression;
|
||||||
|
var isLeft = parameter.IsLeft;
|
||||||
|
var isSingle = parameter.Context.IsSingle;
|
||||||
|
object value = GetValue(expression.Member, expression);
|
||||||
|
if (parameter.BaseParameter.BinaryExpressionInfoList != null)
|
||||||
|
{
|
||||||
|
parameter.BaseParameter.BinaryExpressionInfoList.Add(new KeyValuePair<string, BinaryExpressionInfo>(ExpressionConst.BinaryExpressionInfoListKey, new BinaryExpressionInfo()
|
||||||
|
{
|
||||||
|
IsLeft = Convert.ToBoolean(isLeft),
|
||||||
|
Value = value,
|
||||||
|
ExpressionType = expression.Expression.GetType()
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
if (isLeft == null && base.Context.SqlWhere == null)
|
||||||
|
{
|
||||||
|
base.Context.SqlWhere = new StringBuilder();
|
||||||
|
base.Context.SqlWhere.Append(value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
private object GetValue(MemberInfo member, Expression expression)
|
||||||
|
{
|
||||||
|
var memberInfos = new Stack<MemberInfo>();
|
||||||
|
var fieldInfo = member as System.Reflection.FieldInfo;
|
||||||
|
object reval = null;
|
||||||
|
// "descend" toward's the root object reference:
|
||||||
|
while (expression is MemberExpression)
|
||||||
|
{
|
||||||
|
var memberExpr = expression as MemberExpression;
|
||||||
|
memberInfos.Push(memberExpr.Member);
|
||||||
|
if (memberExpr.Expression == null)
|
||||||
|
{
|
||||||
|
var isProperty = memberExpr.Member.MemberType == MemberTypes.Property;
|
||||||
|
var isField = memberExpr.Member.MemberType == MemberTypes.Field;
|
||||||
|
if (isProperty)
|
||||||
|
{
|
||||||
|
reval = GetPropertyValue(memberExpr);
|
||||||
|
}
|
||||||
|
else if (isField)
|
||||||
|
{
|
||||||
|
reval = GetFiledValue(memberExpr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (memberExpr.Expression == null)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
expression = memberExpr.Expression;
|
||||||
|
}
|
||||||
|
// fetch the root object reference:
|
||||||
|
var constExpr = expression as ConstantExpression;
|
||||||
|
if (constExpr == null)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
var objReference = constExpr.Value;
|
||||||
|
|
||||||
|
// "ascend" back whence we came from and resolve object references along the way:
|
||||||
|
while (memberInfos.Count > 0) // or some other break condition
|
||||||
|
{
|
||||||
|
var mi = memberInfos.Pop();
|
||||||
|
if (mi.MemberType == MemberTypes.Property)
|
||||||
|
{
|
||||||
|
var objProp = objReference.GetType().GetProperty(mi.Name);
|
||||||
|
if (objProp == null)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
objReference = objProp.GetValue(objReference, null);
|
||||||
|
}
|
||||||
|
else if (mi.MemberType == MemberTypes.Field)
|
||||||
|
{
|
||||||
|
var objField = objReference.GetType().GetField(mi.Name);
|
||||||
|
if (objField == null)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
objReference = objField.GetValue(objReference);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
reval = objReference;
|
||||||
|
return reval;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static object GetFiledValue(MemberExpression memberExpr)
|
||||||
|
{
|
||||||
|
object reval;
|
||||||
|
{
|
||||||
|
FieldInfo field = (FieldInfo)memberExpr.Member;
|
||||||
|
reval = field.GetValue(memberExpr.Member);
|
||||||
|
if (reval != null && reval.GetType().IsClass && reval.GetType() != ExpressionConst.StringType)
|
||||||
|
{
|
||||||
|
var fieldName = memberExpr.Member.Name;
|
||||||
|
var proInfo = reval.GetType().GetProperty(fieldName);
|
||||||
|
if (proInfo != null)
|
||||||
|
{
|
||||||
|
reval = proInfo.GetValue(reval, null);
|
||||||
|
}
|
||||||
|
var fieInfo = reval.GetType().GetField(fieldName);
|
||||||
|
if (fieInfo != null)
|
||||||
|
{
|
||||||
|
reval = fieInfo.GetValue(reval);
|
||||||
|
}
|
||||||
|
if (fieInfo == null && proInfo == null)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return reval;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static object GetPropertyValue(MemberExpression memberExpr)
|
||||||
|
{
|
||||||
|
object reval;
|
||||||
|
PropertyInfo pro = (PropertyInfo)memberExpr.Member;
|
||||||
|
reval = pro.GetValue(memberExpr.Member, null);
|
||||||
|
if (reval != null && reval.GetType().IsClass && reval.GetType() != ExpressionConst.StringType)
|
||||||
|
{
|
||||||
|
var fieldName = memberExpr.Member.Name;
|
||||||
|
var proInfo = reval.GetType().GetProperty(fieldName);
|
||||||
|
if (proInfo != null)
|
||||||
|
{
|
||||||
|
reval = proInfo.GetValue(reval, null);
|
||||||
|
}
|
||||||
|
var fieInfo = reval.GetType().GetField(fieldName);
|
||||||
|
if (fieInfo != null)
|
||||||
|
{
|
||||||
|
reval = fieInfo.GetValue(reval);
|
||||||
|
}
|
||||||
|
if (fieInfo == null && proInfo == null)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return reval;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,16 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace SqlSugar
|
||||||
|
{
|
||||||
|
public class MemberNewExpressionResolve : BaseResolve
|
||||||
|
{
|
||||||
|
public MemberNewExpressionResolve(ExpressionParameter parameter) : base(parameter) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
@ -99,6 +99,8 @@
|
|||||||
<Compile Include="Entities\DbTableInfo.cs" />
|
<Compile Include="Entities\DbTableInfo.cs" />
|
||||||
<Compile Include="ExpressionsToSql\BinaryExpressionInfo.cs" />
|
<Compile Include="ExpressionsToSql\BinaryExpressionInfo.cs" />
|
||||||
<Compile Include="ExpressionsToSql\ExpressionErrorMessage.cs" />
|
<Compile Include="ExpressionsToSql\ExpressionErrorMessage.cs" />
|
||||||
|
<Compile Include="ExpressionsToSql\ResolveItems\MemberConstExpressionResolve.cs" />
|
||||||
|
<Compile Include="ExpressionsToSql\ResolveItems\MemberNewExpressionResolve.cs" />
|
||||||
<Compile Include="ExpressionsToSql\SugarParameter.cs" />
|
<Compile Include="ExpressionsToSql\SugarParameter.cs" />
|
||||||
<Compile Include="ExpressionsToSql\ExpressionParameter.cs" />
|
<Compile Include="ExpressionsToSql\ExpressionParameter.cs" />
|
||||||
<Compile Include="Entities\JoinQueryInfo.cs" />
|
<Compile Include="Entities\JoinQueryInfo.cs" />
|
||||||
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Loading…
Reference in New Issue
Block a user