提交 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,6 +353,49 @@ namespace Dapper.Lite
}
#endregion
#region VisitMember 字段或属性
/// <summary>
/// 字段或属性
/// </summary>
public ExpMemberValue VisitMember(Expression exp, MemberExpression parent = null)
{
ExpMemberValue result = new ExpMemberValue();
if (exp.NodeType == ExpressionType.MemberAccess)
{
MemberExpression mebmerExp = exp as MemberExpression;
if (mebmerExp.Expression is ParameterExpression) // 例: exp = t.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))
{
Alias = parameterExp.Name;
}
}
else
{
throw new Exception("不支持");
}
}
else if (exp.NodeType == ExpressionType.Convert) //例:exp = t.OrderTime >= startTime (表达式左边OrderTime的类型是可空类型DateTime?)
{
return VisitMember((exp as UnaryExpression).Operand);
}
else
{
throw new Exception("不支持");
}
return result;
}
#endregion
#region VisitValue 取值
/// <summary>
/// 第一级
......@@ -398,49 +441,6 @@ namespace Dapper.Lite
}
#endregion
#region VisitMember 字段或属性
/// <summary>
/// 字段或属性
/// </summary>
public ExpMemberValue VisitMember(Expression exp, MemberExpression parent = null)
{
ExpMemberValue result = new ExpMemberValue();
if (exp.NodeType == ExpressionType.MemberAccess)
{
MemberExpression mebmerExp = exp as MemberExpression;
if (mebmerExp.Expression is ParameterExpression) // 例: exp = t.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))
{
Alias = parameterExp.Name;
}
}
else
{
throw new Exception("不支持");
}
}
else if (exp.NodeType == ExpressionType.Convert) //例:exp = t.OrderTime >= startTime (表达式左边OrderTime的类型是可空类型DateTime?)
{
return VisitMember((exp as UnaryExpression).Operand);
}
else
{
throw new Exception("不支持");
}
return result;
}
#endregion
#region InvokeValue
public object InvokeValue(Expression exp)
{
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册