提交 423adda5 编写于 作者: s0611163's avatar s0611163

where U

上级 e157224b
......@@ -21,6 +21,12 @@ namespace Dapper.Lite
/// </summary>
/// <param name="expression">Lambda 表达式</param>
ISqlString<T> Where(Expression<Func<T, object>> expression);
/// <summary>
/// 追加参数化查询条件SQL
/// </summary>
/// <param name="expression">Lambda 表达式</param>
ISqlString<T> Where<U>(Expression<Func<U, object>> expression);
#endregion
}
......
......@@ -66,6 +66,43 @@ namespace Dapper.Lite
}
#endregion
#region Where
/// <summary>
/// 追加参数化查询条件SQL
/// </summary>
/// <param name="expression">Lambda 表达式</param>
public ISqlString<T> Where<U>(Expression<Func<U, object>> expression)
{
try
{
ExpressionHelper<U> condition = new ExpressionHelper<U>(_provider, DbParameterNames, SqlStringMethod.Where);
DbParameter[] dbParameters;
string result = condition.VisitLambda(expression, out dbParameters);
if (dbParameters != null)
{
result = ParamsAddRange(dbParameters, result);
}
if (Sql.ToString().Contains(" where "))
{
Sql.Append(" and " + result);
}
else
{
Sql.Append(" where " + result);
}
}
catch
{
throw;
}
return this;
}
#endregion
}
/// <summary>
......
......@@ -353,41 +353,39 @@ namespace Dapper.Lite
}
#endregion
#region VisitValue 取值
#region VisitMember 字段或属性
/// <summary>
/// 第一级
/// 字段或属性
/// </summary>
public object VisitValue(Expression exp, MemberExpression parent = null)
public ExpMemberValue VisitMember(Expression exp, MemberExpression parent = null)
{
object result = new object();
ExpMemberValue result = new ExpMemberValue();
if (exp.NodeType == ExpressionType.Call) // 例: t => t.Status == int.Parse("0") 例: t => t.OrderTime <= DateTime.Now.AddDays(1)
{
result = ReflectionValue(exp, null);
}
else if (exp.NodeType == ExpressionType.New) // 例: t => t.OrderTime > new DateTime(2020, 1, 1)
if (exp.NodeType == ExpressionType.MemberAccess)
{
result = VisitNew(exp as NewExpression);
}
else if (exp.NodeType == ExpressionType.MemberAccess)
MemberExpression mebmerExp = exp as MemberExpression;
if (mebmerExp.Expression is ParameterExpression) // 例: exp = t.Remark
{
MemberExpression memberExp = exp as MemberExpression;
if (memberExp.Expression is MemberExpression) // 支持对象变量的属性 例: t => t.OrderTime > time.startTime.Value 例: t => t.Remark.Contains(order.Remark)
ParameterExpression parameterExp = mebmerExp.Expression as ParameterExpression;
result.MemberParentName = parameterExp.Name;
result.MemberDBField = GetDbField(mebmerExp.Member.Name, mebmerExp.Expression.Type);
result.MemberName = mebmerExp.Member.Name;
result.MemberAliasName = mebmerExp.Member.Name;
if (Alias == null && mebmerExp.Expression.Type == typeof(T))
{
result = VisitValue(memberExp.Expression, memberExp);
Alias = parameterExp.Name;
}
}
else
{
result = ReflectionValue(exp, parent); // 例: t => t.OrderTime < DateTime.Now 例: t => t.Remark.Contains(new BsOrder().Remark)
}
throw new Exception("不支持");
}
else if (exp.NodeType == ExpressionType.Constant) // 支持常量、null
{
result = VisitConstant(exp);
}
else if (exp.NodeType == ExpressionType.Convert) // 字段是可空类型的情况
else if (exp.NodeType == ExpressionType.Convert) //例:exp = t.OrderTime >= startTime (表达式左边OrderTime的类型是可空类型DateTime?)
{
result = VisitConvert(exp);
return VisitMember((exp as UnaryExpression).Operand);
}
else
{
......@@ -398,39 +396,41 @@ namespace Dapper.Lite
}
#endregion
#region VisitMember 字段或属性
#region VisitValue 取值
/// <summary>
/// 字段或属性
/// 第一级
/// </summary>
public ExpMemberValue VisitMember(Expression exp, MemberExpression parent = null)
public object VisitValue(Expression exp, MemberExpression parent = null)
{
ExpMemberValue result = new ExpMemberValue();
object result = new object();
if (exp.NodeType == ExpressionType.MemberAccess)
{
MemberExpression mebmerExp = exp as MemberExpression;
if (mebmerExp.Expression is ParameterExpression) // 例: exp = t.Remark
if (exp.NodeType == ExpressionType.Call) // 例: t => t.Status == int.Parse("0") 例: t => t.OrderTime <= DateTime.Now.AddDays(1)
{
ParameterExpression parameterExp = mebmerExp.Expression as ParameterExpression;
result.MemberParentName = parameterExp.Name;
result.MemberDBField = GetDbField(mebmerExp.Member.Name, mebmerExp.Expression.Type);
result.MemberName = mebmerExp.Member.Name;
result.MemberAliasName = mebmerExp.Member.Name;
if (Alias == null && mebmerExp.Expression.Type == typeof(T))
result = ReflectionValue(exp, null);
}
else if (exp.NodeType == ExpressionType.New) // 例: t => t.OrderTime > new DateTime(2020, 1, 1)
{
Alias = parameterExp.Name;
result = VisitNew(exp as NewExpression);
}
else if (exp.NodeType == ExpressionType.MemberAccess)
{
MemberExpression memberExp = exp as MemberExpression;
if (memberExp.Expression is MemberExpression) // 支持对象变量的属性 例: t => t.OrderTime > time.startTime.Value 例: t => t.Remark.Contains(order.Remark)
{
result = VisitValue(memberExp.Expression, memberExp);
}
else
{
throw new Exception("不支持");
result = ReflectionValue(exp, parent); // 例: t => t.OrderTime < DateTime.Now 例: t => t.Remark.Contains(new BsOrder().Remark)
}
}
else if (exp.NodeType == ExpressionType.Convert) //例:exp = t.OrderTime >= startTime (表达式左边OrderTime的类型是可空类型DateTime?)
else if (exp.NodeType == ExpressionType.Constant) // 支持常量、null
{
return VisitMember((exp as UnaryExpression).Operand);
result = VisitConstant(exp);
}
else if (exp.NodeType == ExpressionType.Convert) // 字段是可空类型的情况
{
result = VisitConvert(exp);
}
else
{
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册