mirror of
https://github.com/nsnail/FreeSql.git
synced 2025-04-22 10:42:52 +08:00
- 增加 HzyTuple 表达式替换类;
This commit is contained in:
parent
f3bc47feca
commit
768cbdc97a
@ -379,6 +379,11 @@ WHERE ROWNUM < 11";
|
||||
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>()
|
||||
.InnerJoin((a,b) => true)
|
||||
.Where((a,b) => (DateTime.Now - a.EditTime).TotalMinutes > 100)
|
||||
|
@ -9,7 +9,9 @@ using System.Threading.Tasks;
|
||||
|
||||
namespace FreeSql
|
||||
{
|
||||
public partial interface ISelect0<TSelect, T1>
|
||||
public partial interface ISelect0 { }
|
||||
|
||||
public partial interface ISelect0<TSelect, T1> : ISelect0
|
||||
{
|
||||
|
||||
#if net40
|
||||
|
@ -54,6 +54,7 @@ namespace FreeSql
|
||||
|
||||
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> Where(Expression<Func<NativeTuple<T1, T2>, bool>> exp);
|
||||
|
||||
ISelectGrouping<TKey, NativeTuple<T1, T2>> GroupBy<TKey>(Expression<Func<T1, T2, TKey>> exp);
|
||||
|
||||
|
@ -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)
|
||||
{
|
||||
//参数化设置,日后优化
|
||||
|
@ -60,7 +60,7 @@ namespace FreeSql.Internal.CommonProvider
|
||||
#endif
|
||||
_includeInfo.Clear();
|
||||
_selectExpression = null;
|
||||
_whereGlobalFilter.Clear();
|
||||
_whereGlobalFilter?.Clear();
|
||||
}
|
||||
|
||||
public static void CopyData(Select0Provider from, Select0Provider to, ReadOnlyCollection<ParameterExpression> lambParms)
|
||||
|
@ -178,6 +178,14 @@ namespace FreeSql.Internal.CommonProvider
|
||||
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)
|
||||
{
|
||||
if (exp == null) return this.Any();
|
||||
|
Loading…
x
Reference in New Issue
Block a user