- 增加 HzyTuple 表达式替换类;

This commit is contained in:
2881099 2020-11-02 22:24:59 +08:00
parent f3bc47feca
commit 768cbdc97a
6 changed files with 51 additions and 2 deletions

View File

@ -379,6 +379,11 @@ WHERE ROWNUM < 11";
var dkkdksdjgj22 = g.mysql.Select<TaskBuild>().Where(a => a.OptionsEntity04 > DateTime.Now.Subtract(dt1970).TotalSeconds).ToSql(); var dkkdksdjgj22 = g.mysql.Select<TaskBuild>().Where(a => a.OptionsEntity04 > DateTime.Now.Subtract(dt1970).TotalSeconds).ToSql();
var xxxhzytuple = g.sqlserver.Select<Templates, TaskBuild>()
.Where(a => a.Item1.Code == "xxx" && a.Item2.OptionsEntity03 == true)
.ToSql();
var xxxkdkd = g.oracle.Select<Templates, TaskBuild>() var xxxkdkd = g.oracle.Select<Templates, TaskBuild>()
.InnerJoin((a,b) => true) .InnerJoin((a,b) => true)
.Where((a,b) => (DateTime.Now - a.EditTime).TotalMinutes > 100) .Where((a,b) => (DateTime.Now - a.EditTime).TotalMinutes > 100)

View File

@ -9,7 +9,9 @@ using System.Threading.Tasks;
namespace FreeSql namespace FreeSql
{ {
public partial interface ISelect0<TSelect, T1> public partial interface ISelect0 { }
public partial interface ISelect0<TSelect, T1> : ISelect0
{ {
#if net40 #if net40

View File

@ -54,6 +54,7 @@ namespace FreeSql
ISelect<T1, T2> Where(Expression<Func<T1, T2, bool>> exp); ISelect<T1, T2> Where(Expression<Func<T1, T2, bool>> exp);
ISelect<T1, T2> WhereIf(bool condition, Expression<Func<T1, T2, bool>> exp); ISelect<T1, T2> WhereIf(bool condition, Expression<Func<T1, T2, bool>> exp);
ISelect<T1, T2> Where(Expression<Func<NativeTuple<T1, T2>, bool>> exp);
ISelectGrouping<TKey, NativeTuple<T1, T2>> GroupBy<TKey>(Expression<Func<T1, T2, TKey>> exp); ISelectGrouping<TKey, NativeTuple<T1, T2>> GroupBy<TKey>(Expression<Func<T1, T2, TKey>> exp);

View File

@ -1664,6 +1664,39 @@ namespace FreeSql.Internal
} }
} }
internal class ReplaceHzyTupleToMultiParam : ExpressionVisitor
{
private List<SelectTableInfo> tables;
private ParameterExpression[] parameters;
public LambdaExpression Modify(LambdaExpression lambda, List<SelectTableInfo> tables)
{
this.tables = tables;
parameters = tables.Select(a => a.Parameter ?? Expression.Parameter(a.Table.Type, a.Alias)).ToArray();
var exp = Visit(lambda.Body);
return Expression.Lambda(exp, parameters);
}
protected override Expression VisitMember(MemberExpression node)
{
int widx;
if (node.Expression?.NodeType == ExpressionType.MemberAccess)
{
var parent = node.Expression as MemberExpression;
if (parent.Expression?.NodeType == ExpressionType.Parameter &&
parent.Expression.Type.Name.StartsWith("NativeTuple`") == true &&
int.TryParse(parent.Member.Name.Replace("Item", ""), out widx) && widx > 0 && widx <= tables.Count)
return Expression.Property(parameters[widx - 1], node.Member.Name);
}
if (node.Expression?.NodeType == ExpressionType.Parameter &&
node.Expression.Type.Name.StartsWith("NativeTuple`") == true &&
int.TryParse(node.Member.Name.Replace("Item", ""), out widx) && widx > 0 && widx <= tables.Count)
return parameters[widx - 1];
return base.VisitMember(node);
}
}
public string formatSql(object obj, Type mapType, ColumnInfo mapColumn, List<DbParameter> dbParams) public string formatSql(object obj, Type mapType, ColumnInfo mapColumn, List<DbParameter> dbParams)
{ {
//参数化设置,日后优化 //参数化设置,日后优化

View File

@ -60,7 +60,7 @@ namespace FreeSql.Internal.CommonProvider
#endif #endif
_includeInfo.Clear(); _includeInfo.Clear();
_selectExpression = null; _selectExpression = null;
_whereGlobalFilter.Clear(); _whereGlobalFilter?.Clear();
} }
public static void CopyData(Select0Provider from, Select0Provider to, ReadOnlyCollection<ParameterExpression> lambParms) public static void CopyData(Select0Provider from, Select0Provider to, ReadOnlyCollection<ParameterExpression> lambParms)

View File

@ -178,6 +178,14 @@ namespace FreeSql.Internal.CommonProvider
return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereGlobalFilter, _params)); return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null, _whereGlobalFilter, _params));
} }
ISelect<T1, T2> ISelect<T1, T2>.Where(Expression<Func<NativeTuple<T1, T2>, bool>> exp)
{
if (exp == null) return this.Where(null);
var exp2 = new CommonExpression.ReplaceHzyTupleToMultiParam().Modify(exp, _tables);
for (var a = 0; a < exp2.Parameters.Count; a++) _tables[a].Parameter = exp2.Parameters[a];
return this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp2, null, _whereGlobalFilter, _params));
}
bool ISelect<T1, T2>.Any(Expression<Func<T1, T2, bool>> exp) bool ISelect<T1, T2>.Any(Expression<Func<T1, T2, bool>> exp)
{ {
if (exp == null) return this.Any(); if (exp == null) return this.Any();