mirror of
https://github.com/nsnail/FreeSql.git
synced 2025-04-22 02:32:50 +08:00
fix WithTempQuery 05
This commit is contained in:
parent
a419036999
commit
2f76a22e21
@ -800,14 +800,5 @@
|
|||||||
<param name="that"></param>
|
<param name="that"></param>
|
||||||
<returns></returns>
|
<returns></returns>
|
||||||
</member>
|
</member>
|
||||||
<member name="M:Microsoft.Extensions.DependencyInjection.FreeSqlRepositoryDependencyInjection.AddFreeRepository(Microsoft.Extensions.DependencyInjection.IServiceCollection,System.Action{FreeSql.FluentDataFilter},System.Reflection.Assembly[])">
|
|
||||||
<summary>
|
|
||||||
批量注入 Repository,可以参考代码自行调整
|
|
||||||
</summary>
|
|
||||||
<param name="services"></param>
|
|
||||||
<param name="globalDataFilter"></param>
|
|
||||||
<param name="assemblies"></param>
|
|
||||||
<returns></returns>
|
|
||||||
</member>
|
|
||||||
</members>
|
</members>
|
||||||
</doc>
|
</doc>
|
||||||
|
@ -174,6 +174,57 @@ WHERE (a.[rownum] = 1)";
|
|||||||
Assert.Equal(list04[1].Id, 4);
|
Assert.Equal(list04[1].Id, 4);
|
||||||
Assert.Equal(list04[2].rownum, 1);
|
Assert.Equal(list04[2].rownum, 1);
|
||||||
Assert.Equal(list04[2].Id, 5);
|
Assert.Equal(list04[2].Id, 5);
|
||||||
|
|
||||||
|
|
||||||
|
var sql05 = fsql.Select<TwoTablePartitionBy_User>()
|
||||||
|
.Where(a => a.Id > 0)
|
||||||
|
.WithTempQuery(a => new
|
||||||
|
{
|
||||||
|
a.Id,
|
||||||
|
a.Nickname
|
||||||
|
})
|
||||||
|
.GroupBy(a => new { a.Nickname })
|
||||||
|
.WithTempQuery(a => new
|
||||||
|
{
|
||||||
|
a.Key,
|
||||||
|
sum1 = a.Sum(a.Value.Id),
|
||||||
|
cou1 = a.Count()
|
||||||
|
})
|
||||||
|
.ToSql();
|
||||||
|
var assertSql05 = @"SELECT *
|
||||||
|
FROM (
|
||||||
|
SELECT a.[Nickname], sum(a.[Id]) [sum1], count(1) [cou1]
|
||||||
|
FROM (
|
||||||
|
SELECT a.[Id], a.[Nickname]
|
||||||
|
FROM [TwoTablePartitionBy_User] a
|
||||||
|
WHERE (a.[Id] > 0) ) a
|
||||||
|
GROUP BY a.[Nickname] ) a";
|
||||||
|
Assert.Equal(assertSql05, sql05);
|
||||||
|
var list05 = fsql.Select<TwoTablePartitionBy_User>()
|
||||||
|
.Where(a => a.Id > 0)
|
||||||
|
.WithTempQuery(a => new
|
||||||
|
{
|
||||||
|
a.Id,
|
||||||
|
a.Nickname
|
||||||
|
})
|
||||||
|
.GroupBy(a => new { a.Nickname })
|
||||||
|
.WithTempQuery(a => new
|
||||||
|
{
|
||||||
|
a.Key,
|
||||||
|
sum1 = a.Sum(a.Value.Id),
|
||||||
|
cou1 = a.Count()
|
||||||
|
})
|
||||||
|
.ToList();
|
||||||
|
Assert.Equal(3, list05.Count);
|
||||||
|
Assert.Equal("name01", list05[0].Key.Nickname);
|
||||||
|
Assert.Equal(6, list05[0].sum1);
|
||||||
|
Assert.Equal(3, list05[0].cou1);
|
||||||
|
Assert.Equal("name02", list05[1].Key.Nickname);
|
||||||
|
Assert.Equal(4, list05[1].sum1);
|
||||||
|
Assert.Equal(1, list05[1].cou1);
|
||||||
|
Assert.Equal("name03", list05[2].Key.Nickname);
|
||||||
|
Assert.Equal(11, list05[2].sum1);
|
||||||
|
Assert.Equal(2, list05[2].cou1);
|
||||||
}
|
}
|
||||||
class SingleTablePartitionBy_User
|
class SingleTablePartitionBy_User
|
||||||
{
|
{
|
||||||
@ -527,7 +578,8 @@ FROM (
|
|||||||
SELECT a.[Id], a.[Nickname], row_number() over( partition by a.[Nickname] order by a.[Id]) [rownum]
|
SELECT a.[Id], a.[Nickname], row_number() over( partition by a.[Nickname] order by a.[Id]) [rownum]
|
||||||
FROM [TwoTablePartitionBy_User] a ) a
|
FROM [TwoTablePartitionBy_User] a ) a
|
||||||
WHERE (a.[rownum] = 1) ) a
|
WHERE (a.[rownum] = 1) ) a
|
||||||
INNER JOIN (SELECT a.[UserId], a.[Remark]
|
INNER JOIN (
|
||||||
|
SELECT a.[UserId], a.[Remark]
|
||||||
FROM [TwoTablePartitionBy_UserExt] a) b ON a.[Id] = b.[UserId]
|
FROM [TwoTablePartitionBy_UserExt] a) b ON a.[Id] = b.[UserId]
|
||||||
WHERE ((a.[Nickname] = N'name03' OR a.[Nickname] = N'name02'))";
|
WHERE ((a.[Nickname] = N'name03' OR a.[Nickname] = N'name02'))";
|
||||||
Assert.Equal(sql07, assertSql07);
|
Assert.Equal(sql07, assertSql07);
|
||||||
@ -567,7 +619,8 @@ WHERE ((a.[Nickname] = N'name03' OR a.[Nickname] = N'name02'))";
|
|||||||
FROM (
|
FROM (
|
||||||
SELECT a.[Id], a.[Nickname], row_number() over( partition by a.[Nickname] order by a.[Id]) [rownum]
|
SELECT a.[Id], a.[Nickname], row_number() over( partition by a.[Nickname] order by a.[Id]) [rownum]
|
||||||
FROM [TwoTablePartitionBy_User] a ) a
|
FROM [TwoTablePartitionBy_User] a ) a
|
||||||
INNER JOIN (SELECT a.[UserId], a.[Remark]
|
INNER JOIN (
|
||||||
|
SELECT a.[UserId], a.[Remark]
|
||||||
FROM [TwoTablePartitionBy_UserExt] a
|
FROM [TwoTablePartitionBy_UserExt] a
|
||||||
WHERE (a.[UserId] > 0)) b ON a.[Id] = b.[UserId]
|
WHERE (a.[UserId] > 0)) b ON a.[Id] = b.[UserId]
|
||||||
WHERE (a.[rownum] = 1) AND ((a.[Nickname] = N'name03' OR a.[Nickname] = N'name02'))";
|
WHERE (a.[rownum] = 1) AND ((a.[Nickname] = N'name03' OR a.[Nickname] = N'name02'))";
|
||||||
@ -599,7 +652,7 @@ WHERE (a.[rownum] = 1) AND ((a.[Nickname] = N'name03' OR a.[Nickname] = N'name02
|
|||||||
rownum = SqlExt.RowNumber().Over().PartitionBy(a.Nickname).OrderBy(a.Id).ToValue()
|
rownum = SqlExt.RowNumber().Over().PartitionBy(a.Nickname).OrderBy(a.Id).ToValue()
|
||||||
})
|
})
|
||||||
.Where(a => a.rownum == 1)
|
.Where(a => a.rownum == 1)
|
||||||
.FromQuery(fsql.Select<TwoTablePartitionBy_UserExt>().Where(b => b.UserId > 0).GroupBy(b => new { b.UserId, b.Remark }).WithTempQuery(b => b.Key))
|
.FromQuery(fsql.Select<TwoTablePartitionBy_UserExt>().Where(b => b.UserId > 0).WithTempQuery(b => new { b.UserId, b.Remark }))
|
||||||
.InnerJoin((a, b) => a.user.Id == b.UserId)
|
.InnerJoin((a, b) => a.user.Id == b.UserId)
|
||||||
.Where((a, b) => a.user.Nickname == "name03" || a.user.Nickname == "name02")
|
.Where((a, b) => a.user.Nickname == "name03" || a.user.Nickname == "name02")
|
||||||
.ToSql((a, b) => new TwoTablePartitionBy_UserDto());
|
.ToSql((a, b) => new TwoTablePartitionBy_UserDto());
|
||||||
@ -607,10 +660,10 @@ WHERE (a.[rownum] = 1) AND ((a.[Nickname] = N'name03' OR a.[Nickname] = N'name02
|
|||||||
FROM (
|
FROM (
|
||||||
SELECT a.[Id], a.[Nickname], row_number() over( partition by a.[Nickname] order by a.[Id]) [rownum]
|
SELECT a.[Id], a.[Nickname], row_number() over( partition by a.[Nickname] order by a.[Id]) [rownum]
|
||||||
FROM [TwoTablePartitionBy_User] a ) a
|
FROM [TwoTablePartitionBy_User] a ) a
|
||||||
INNER JOIN ( SELECT a.[UserId], a.[Remark]
|
INNER JOIN (
|
||||||
|
SELECT a.[UserId], a.[Remark]
|
||||||
FROM [TwoTablePartitionBy_UserExt] a
|
FROM [TwoTablePartitionBy_UserExt] a
|
||||||
WHERE (a.[UserId] > 0)
|
WHERE (a.[UserId] > 0) ) b ON a.[Id] = b.[UserId]
|
||||||
GROUP BY a.[UserId], a.[Remark] ) b ON a.[Id] = b.[UserId]
|
|
||||||
WHERE (a.[rownum] = 1) AND ((a.[Nickname] = N'name03' OR a.[Nickname] = N'name02'))";
|
WHERE (a.[rownum] = 1) AND ((a.[Nickname] = N'name03' OR a.[Nickname] = N'name02'))";
|
||||||
Assert.Equal(sql09, assertSql09);
|
Assert.Equal(sql09, assertSql09);
|
||||||
var list09 = fsql.Select<TwoTablePartitionBy_User>()
|
var list09 = fsql.Select<TwoTablePartitionBy_User>()
|
||||||
@ -620,7 +673,7 @@ WHERE (a.[rownum] = 1) AND ((a.[Nickname] = N'name03' OR a.[Nickname] = N'name02
|
|||||||
rownum = SqlExt.RowNumber().Over().PartitionBy(a.Nickname).OrderBy(a.Id).ToValue()
|
rownum = SqlExt.RowNumber().Over().PartitionBy(a.Nickname).OrderBy(a.Id).ToValue()
|
||||||
})
|
})
|
||||||
.Where(a => a.rownum == 1)
|
.Where(a => a.rownum == 1)
|
||||||
.FromQuery(fsql.Select<TwoTablePartitionBy_UserExt>().Where(b => b.UserId > 0).GroupBy(b => new { b.UserId, b.Remark }).WithTempQuery(b => b.Key))
|
.FromQuery(fsql.Select<TwoTablePartitionBy_UserExt>().Where(b => b.UserId > 0).WithTempQuery(b => new { b.UserId, b.Remark }))
|
||||||
.InnerJoin((a, b) => a.user.Id == b.UserId)
|
.InnerJoin((a, b) => a.user.Id == b.UserId)
|
||||||
.Where((a, b) => a.user.Nickname == "name03" || a.user.Nickname == "name02")
|
.Where((a, b) => a.user.Nickname == "name03" || a.user.Nickname == "name02")
|
||||||
.ToList<TwoTablePartitionBy_UserDto>();
|
.ToList<TwoTablePartitionBy_UserDto>();
|
||||||
@ -633,6 +686,48 @@ WHERE (a.[rownum] = 1) AND ((a.[Nickname] = N'name03' OR a.[Nickname] = N'name02
|
|||||||
Assert.Equal(list09[1].remark, "remark05");
|
Assert.Equal(list09[1].remark, "remark05");
|
||||||
|
|
||||||
|
|
||||||
|
var sql091 = fsql.Select<TwoTablePartitionBy_User>()
|
||||||
|
.WithTempQuery(a => new
|
||||||
|
{
|
||||||
|
user = a,
|
||||||
|
rownum = SqlExt.RowNumber().Over().PartitionBy(a.Nickname).OrderBy(a.Id).ToValue()
|
||||||
|
})
|
||||||
|
.Where(a => a.rownum == 1)
|
||||||
|
.FromQuery(fsql.Select<TwoTablePartitionBy_UserExt>().Where(b => b.UserId > 0).GroupBy(b => new { b.UserId, b.Remark }).WithTempQuery(b => b.Key))
|
||||||
|
.InnerJoin((a, b) => a.user.Id == b.UserId)
|
||||||
|
.Where((a, b) => a.user.Nickname == "name03" || a.user.Nickname == "name02")
|
||||||
|
.ToSql((a, b) => new TwoTablePartitionBy_UserDto());
|
||||||
|
var assertSql091 = @"SELECT a.[rownum] as1, b.[Remark] as2
|
||||||
|
FROM (
|
||||||
|
SELECT a.[Id], a.[Nickname], row_number() over( partition by a.[Nickname] order by a.[Id]) [rownum]
|
||||||
|
FROM [TwoTablePartitionBy_User] a ) a
|
||||||
|
INNER JOIN (
|
||||||
|
SELECT a.[UserId], a.[Remark]
|
||||||
|
FROM [TwoTablePartitionBy_UserExt] a
|
||||||
|
WHERE (a.[UserId] > 0)
|
||||||
|
GROUP BY a.[UserId], a.[Remark] ) b ON a.[Id] = b.[UserId]
|
||||||
|
WHERE (a.[rownum] = 1) AND ((a.[Nickname] = N'name03' OR a.[Nickname] = N'name02'))";
|
||||||
|
Assert.Equal(sql091, assertSql091);
|
||||||
|
var list091 = fsql.Select<TwoTablePartitionBy_User>()
|
||||||
|
.WithTempQuery(a => new
|
||||||
|
{
|
||||||
|
user = a,
|
||||||
|
rownum = SqlExt.RowNumber().Over().PartitionBy(a.Nickname).OrderBy(a.Id).ToValue()
|
||||||
|
})
|
||||||
|
.Where(a => a.rownum == 1)
|
||||||
|
.FromQuery(fsql.Select<TwoTablePartitionBy_UserExt>().Where(b => b.UserId > 0).GroupBy(b => new { b.UserId, b.Remark }).WithTempQuery(b => b.Key))
|
||||||
|
.InnerJoin((a, b) => a.user.Id == b.UserId)
|
||||||
|
.Where((a, b) => a.user.Nickname == "name03" || a.user.Nickname == "name02")
|
||||||
|
.ToList<TwoTablePartitionBy_UserDto>();
|
||||||
|
Assert.Equal(list091.Count, 2);
|
||||||
|
Assert.Equal(list091[0].rownum, 1);
|
||||||
|
Assert.Equal(list091[0].Id, 0);
|
||||||
|
Assert.Equal(list091[0].remark, "remark04");
|
||||||
|
Assert.Equal(list091[1].rownum, 1);
|
||||||
|
Assert.Equal(list091[1].Id, 0);
|
||||||
|
Assert.Equal(list091[1].remark, "remark05");
|
||||||
|
|
||||||
|
|
||||||
var sql10 = fsql.Select<TwoTablePartitionBy_User>()
|
var sql10 = fsql.Select<TwoTablePartitionBy_User>()
|
||||||
.WithTempQuery(a => new
|
.WithTempQuery(a => new
|
||||||
{
|
{
|
||||||
@ -648,7 +743,8 @@ WHERE (a.[rownum] = 1) AND ((a.[Nickname] = N'name03' OR a.[Nickname] = N'name02
|
|||||||
FROM (
|
FROM (
|
||||||
SELECT a.[Id], a.[Nickname], row_number() over( partition by a.[Nickname] order by a.[Id]) [rownum]
|
SELECT a.[Id], a.[Nickname], row_number() over( partition by a.[Nickname] order by a.[Id]) [rownum]
|
||||||
FROM [TwoTablePartitionBy_User] a ) a
|
FROM [TwoTablePartitionBy_User] a ) a
|
||||||
INNER JOIN ( SELECT a.[UserId], a.[Remark], sum(a.[UserId]) [rownum]
|
INNER JOIN (
|
||||||
|
SELECT a.[UserId], a.[Remark], sum(a.[UserId]) [rownum]
|
||||||
FROM [TwoTablePartitionBy_UserExt] a
|
FROM [TwoTablePartitionBy_UserExt] a
|
||||||
WHERE (a.[UserId] > 0)
|
WHERE (a.[UserId] > 0)
|
||||||
GROUP BY a.[UserId], a.[Remark] ) b ON a.[Id] = b.[UserId]
|
GROUP BY a.[UserId], a.[Remark] ) b ON a.[Id] = b.[UserId]
|
||||||
@ -689,7 +785,8 @@ WHERE (a.[rownum] = 1) AND ((a.[Nickname] = N'name03' OR a.[Nickname] = N'name02
|
|||||||
FROM (
|
FROM (
|
||||||
SELECT a.[Id], a.[Nickname], row_number() over( partition by a.[Nickname] order by a.[Id]) [rownum]
|
SELECT a.[Id], a.[Nickname], row_number() over( partition by a.[Nickname] order by a.[Id]) [rownum]
|
||||||
FROM [TwoTablePartitionBy_User] a ) a
|
FROM [TwoTablePartitionBy_User] a ) a
|
||||||
INNER JOIN ( SELECT a.[UserId] [uid], sum(a.[UserId]) [rownum]
|
INNER JOIN (
|
||||||
|
SELECT a.[UserId] [uid], sum(a.[UserId]) [rownum]
|
||||||
FROM [TwoTablePartitionBy_UserExt] a
|
FROM [TwoTablePartitionBy_UserExt] a
|
||||||
WHERE (a.[UserId] > 0)
|
WHERE (a.[UserId] > 0)
|
||||||
GROUP BY a.[UserId] ) b ON a.[Id] = b.[uid]
|
GROUP BY a.[UserId] ) b ON a.[Id] = b.[uid]
|
||||||
|
@ -51,14 +51,14 @@ namespace FreeSql.Internal
|
|||||||
public bool ReadAnonymousField(List<SelectTableInfo> _tables, Func<Type, string, string> _tableRule, StringBuilder field, ReadAnonymousTypeInfo parent, ref int index, Expression exp, Select0Provider select,
|
public bool ReadAnonymousField(List<SelectTableInfo> _tables, Func<Type, string, string> _tableRule, StringBuilder field, ReadAnonymousTypeInfo parent, ref int index, Expression exp, Select0Provider select,
|
||||||
BaseDiyMemberExpression diymemexp, List<GlobalFilter.Item> whereGlobalFilter, List<string> findIncludeMany, List<Expression> findSubSelectMany, bool isAllDtoMap)
|
BaseDiyMemberExpression diymemexp, List<GlobalFilter.Item> whereGlobalFilter, List<string> findIncludeMany, List<Expression> findSubSelectMany, bool isAllDtoMap)
|
||||||
{
|
{
|
||||||
void LocalSetFieldAlias(ref int localIndex)
|
void LocalSetFieldAlias(ref int localIndex, bool isdiymemexp)
|
||||||
{
|
{
|
||||||
if (localIndex >= 0)
|
if (localIndex >= 0)
|
||||||
{
|
{
|
||||||
parent.DbNestedField = $"as{++localIndex}";
|
parent.DbNestedField = $"as{++localIndex}";
|
||||||
field.Append(_common.FieldAsAlias(parent.DbNestedField));
|
field.Append(_common.FieldAsAlias(parent.DbNestedField));
|
||||||
}
|
}
|
||||||
else if (diymemexp?.ParseExpMapResult != null)
|
else if (isdiymemexp && diymemexp?.ParseExpMapResult != null)
|
||||||
parent.DbNestedField = diymemexp.ParseExpMapResult.DbNestedField;
|
parent.DbNestedField = diymemexp.ParseExpMapResult.DbNestedField;
|
||||||
else if (string.IsNullOrEmpty(parent.CsName) == false)
|
else if (string.IsNullOrEmpty(parent.CsName) == false)
|
||||||
{
|
{
|
||||||
@ -77,7 +77,7 @@ namespace FreeSql.Internal
|
|||||||
case ExpressionType.NegateChecked:
|
case ExpressionType.NegateChecked:
|
||||||
parent.DbField = $"-({ExpressionLambdaToSql((exp as UnaryExpression)?.Operand, getTSC())})";
|
parent.DbField = $"-({ExpressionLambdaToSql((exp as UnaryExpression)?.Operand, getTSC())})";
|
||||||
field.Append(", ").Append(parent.DbField);
|
field.Append(", ").Append(parent.DbField);
|
||||||
LocalSetFieldAlias(ref index);
|
LocalSetFieldAlias(ref index, false);
|
||||||
if (parent.CsType == null && exp.Type.IsValueType) parent.CsType = exp.Type;
|
if (parent.CsType == null && exp.Type.IsValueType) parent.CsType = exp.Type;
|
||||||
return false;
|
return false;
|
||||||
case ExpressionType.Convert: return ReadAnonymousField(_tables, _tableRule, field, parent, ref index, (exp as UnaryExpression)?.Operand, select, diymemexp, whereGlobalFilter, findIncludeMany, findSubSelectMany, isAllDtoMap);
|
case ExpressionType.Convert: return ReadAnonymousField(_tables, _tableRule, field, parent, ref index, (exp as UnaryExpression)?.Operand, select, diymemexp, whereGlobalFilter, findIncludeMany, findSubSelectMany, isAllDtoMap);
|
||||||
@ -96,7 +96,7 @@ namespace FreeSql.Internal
|
|||||||
else
|
else
|
||||||
parent.DbField = _common.FormatSql("{0}", constExp?.Value);
|
parent.DbField = _common.FormatSql("{0}", constExp?.Value);
|
||||||
field.Append(", ").Append(parent.DbField);
|
field.Append(", ").Append(parent.DbField);
|
||||||
LocalSetFieldAlias(ref index);
|
LocalSetFieldAlias(ref index, false);
|
||||||
if (parent.CsType == null && exp.Type.IsValueType) parent.CsType = exp.Type;
|
if (parent.CsType == null && exp.Type.IsValueType) parent.CsType = exp.Type;
|
||||||
return false;
|
return false;
|
||||||
case ExpressionType.Conditional:
|
case ExpressionType.Conditional:
|
||||||
@ -125,7 +125,7 @@ namespace FreeSql.Internal
|
|||||||
else
|
else
|
||||||
parent.DbField = ExpressionLambdaToSql(exp, getTSC());
|
parent.DbField = ExpressionLambdaToSql(exp, getTSC());
|
||||||
field.Append(", ").Append(parent.DbField);
|
field.Append(", ").Append(parent.DbField);
|
||||||
LocalSetFieldAlias(ref index);
|
LocalSetFieldAlias(ref index, false);
|
||||||
if (parent.CsType == null && exp.Type.IsValueType) parent.CsType = exp.Type;
|
if (parent.CsType == null && exp.Type.IsValueType) parent.CsType = exp.Type;
|
||||||
return false;
|
return false;
|
||||||
case ExpressionType.Parameter:
|
case ExpressionType.Parameter:
|
||||||
@ -273,7 +273,7 @@ namespace FreeSql.Internal
|
|||||||
if (findcol != null) pdbfield = _common.RereadColumn(findcol, pdbfield);
|
if (findcol != null) pdbfield = _common.RereadColumn(findcol, pdbfield);
|
||||||
}
|
}
|
||||||
field.Append(", ").Append(pdbfield);
|
field.Append(", ").Append(pdbfield);
|
||||||
LocalSetFieldAlias(ref index);
|
LocalSetFieldAlias(ref index, true);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
@ -486,7 +486,7 @@ namespace FreeSql.Internal
|
|||||||
}
|
}
|
||||||
parent.DbField = $"({ExpressionLambdaToSql(exp, getTSC())})";
|
parent.DbField = $"({ExpressionLambdaToSql(exp, getTSC())})";
|
||||||
field.Append(", ").Append(parent.DbField);
|
field.Append(", ").Append(parent.DbField);
|
||||||
LocalSetFieldAlias(ref index);
|
LocalSetFieldAlias(ref index, false);
|
||||||
if (parent.CsType == null && exp.Type.IsValueType) parent.CsType = exp.Type;
|
if (parent.CsType == null && exp.Type.IsValueType) parent.CsType = exp.Type;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -2178,6 +2178,23 @@ namespace FreeSql.Internal
|
|||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
public class ReplaceVisitor : ExpressionVisitor
|
||||||
|
{
|
||||||
|
private Expression _oldexp;
|
||||||
|
private Expression _newexp;
|
||||||
|
public Expression Modify(Expression find, Expression oldexp, Expression newexp)
|
||||||
|
{
|
||||||
|
this._oldexp = oldexp;
|
||||||
|
this._newexp = newexp;
|
||||||
|
return Visit(find);
|
||||||
|
}
|
||||||
|
protected override Expression VisitMember(MemberExpression node)
|
||||||
|
{
|
||||||
|
if (node.Expression == _oldexp)
|
||||||
|
return Expression.Property(_newexp, node.Member.Name);
|
||||||
|
return base.VisitMember(node);
|
||||||
|
}
|
||||||
|
}
|
||||||
public class ReplaceParameterVisitor : ExpressionVisitor
|
public class ReplaceParameterVisitor : ExpressionVisitor
|
||||||
{
|
{
|
||||||
private Expression _replaceExp;
|
private Expression _replaceExp;
|
||||||
|
@ -141,11 +141,12 @@ namespace FreeSql.Internal.CommonProvider
|
|||||||
{
|
{
|
||||||
sql2 = select2sp._tableRule(select2sp._tables[0].Table.Type, null);
|
sql2 = select2sp._tableRule(select2sp._tables[0].Table.Type, null);
|
||||||
if (sql2.StartsWith("(") && sql2.EndsWith(")")) sql2 = sql2.Substring(1, sql2.Length - 2);
|
if (sql2.StartsWith("(") && sql2.EndsWith(")")) sql2 = sql2.Substring(1, sql2.Length - 2);
|
||||||
|
if (sql2.StartsWith(" \r\n")) sql2 = sql2.Substring(3);
|
||||||
}
|
}
|
||||||
if (string.IsNullOrWhiteSpace(sql2))
|
if (string.IsNullOrWhiteSpace(sql2))
|
||||||
sql2 = select2?.ToSql("*");
|
sql2 = select2?.ToSql("*");
|
||||||
}
|
}
|
||||||
return ret.WithSql(null, sql2);
|
return ret.WithSql(null, $" \r\n{sql2}");
|
||||||
}
|
}
|
||||||
|
|
||||||
public ISelectGrouping<TKey, T1> GroupBy<TKey>(Expression<Func<T1, TKey>> columns)
|
public ISelectGrouping<TKey, T1> GroupBy<TKey>(Expression<Func<T1, TKey>> columns)
|
||||||
|
@ -38,7 +38,8 @@ namespace FreeSql.Internal.CommonProvider
|
|||||||
ParseExpMapResult = _map;
|
ParseExpMapResult = _map;
|
||||||
return _map.DbField;
|
return _map.DbField;
|
||||||
}
|
}
|
||||||
var parentName = ((members.FirstOrDefault() as MemberExpression)?.Expression as MemberExpression)?.Member.Name;
|
var firstMember = ((members.FirstOrDefault() as MemberExpression)?.Expression as MemberExpression);
|
||||||
|
var parentName = firstMember?.Member.Name;
|
||||||
switch (parentName)
|
switch (parentName)
|
||||||
{
|
{
|
||||||
case "Key":
|
case "Key":
|
||||||
@ -51,29 +52,57 @@ namespace FreeSql.Internal.CommonProvider
|
|||||||
ParseExpMapResult = read;
|
ParseExpMapResult = read;
|
||||||
return read.DbField;
|
return read.DbField;
|
||||||
case "Value":
|
case "Value":
|
||||||
var tb = _tables.First();
|
var curtables = _tables;
|
||||||
|
SelectTableInfo curtable = null;
|
||||||
var foridx = 0;
|
var foridx = 0;
|
||||||
if (members.Length > 1)
|
if (_select._diymemexpWithTempQuery != null && _select._diymemexpWithTempQuery is Select0Provider.WithTempQueryParser tempQueryParser)
|
||||||
{
|
{
|
||||||
var mem0 = (members.FirstOrDefault() as MemberExpression);
|
if (_select._tables.Count == 1)
|
||||||
var mem0Name = mem0?.Member.Name;
|
curtable = _select._tables[0];
|
||||||
if (mem0Name?.StartsWith("Item") == true && int.TryParse(mem0Name.Substring(4), out var tryitemidx))
|
else
|
||||||
{
|
{
|
||||||
if (tryitemidx == 1) foridx++;
|
curtables = _select._tables;
|
||||||
else
|
LocalValueInitData();
|
||||||
|
}
|
||||||
|
if (tempQueryParser._outsideTable.Contains(curtable))
|
||||||
|
{
|
||||||
|
for (var a = 0; a < members.Length; a++)
|
||||||
|
members[a] = new CommonExpression.ReplaceVisitor().Modify(members[a], firstMember, curtable.Parameter);
|
||||||
|
var ret = _select._diymemexpWithTempQuery.ParseExp(members);
|
||||||
|
ParseExpMapResult = _select._diymemexpWithTempQuery.ParseExpMapResult;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
LocalValueInitData();
|
||||||
|
}
|
||||||
|
|
||||||
|
void LocalValueInitData()
|
||||||
|
{
|
||||||
|
curtable = curtables.First();
|
||||||
|
if (members.Length > 1)
|
||||||
|
{
|
||||||
|
var mem0 = (members.FirstOrDefault() as MemberExpression);
|
||||||
|
var mem0Name = mem0?.Member.Name;
|
||||||
|
if (mem0Name?.StartsWith("Item") == true && int.TryParse(mem0Name.Substring(4), out var tryitemidx))
|
||||||
{
|
{
|
||||||
//var alias = $"SP10{(char)(96 + tryitemidx)}";
|
if (tryitemidx == 1) foridx++;
|
||||||
var tmptb = _tables.Where((a, idx) => //a.AliasInit == alias &&
|
else
|
||||||
a.Table.Type == mem0.Type && idx == tryitemidx - 1).FirstOrDefault();
|
|
||||||
if (tmptb != null)
|
|
||||||
{
|
{
|
||||||
tb = tmptb;
|
//var alias = $"SP10{(char)(96 + tryitemidx)}";
|
||||||
foridx++;
|
var tmptb = curtables.Where((a, idx) => //a.AliasInit == alias &&
|
||||||
|
a.Table.Type == mem0.Type && idx == tryitemidx - 1).FirstOrDefault();
|
||||||
|
if (tmptb != null)
|
||||||
|
{
|
||||||
|
curtable = tmptb;
|
||||||
|
foridx++;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
var parmExp = Expression.Parameter(tb.Table.Type, tb.Alias);
|
var parmExp = Expression.Parameter(curtable.Table.Type, curtable.Alias);
|
||||||
Expression retExp = parmExp;
|
Expression retExp = parmExp;
|
||||||
for (var a = foridx; a < members.Length; a++)
|
for (var a = foridx; a < members.Length; a++)
|
||||||
{
|
{
|
||||||
@ -205,7 +234,7 @@ namespace FreeSql.Internal.CommonProvider
|
|||||||
var ret = (_orm as BaseDbProvider).CreateSelectProvider<TDto>(null) as Select1Provider<TDto>;
|
var ret = (_orm as BaseDbProvider).CreateSelectProvider<TDto>(null) as Select1Provider<TDto>;
|
||||||
if (ret._tables[0].Table == null) ret._tables[0].Table = TableInfo.GetDefaultTable(typeof(TDto));
|
if (ret._tables[0].Table == null) ret._tables[0].Table = TableInfo.GetDefaultTable(typeof(TDto));
|
||||||
var parser = new Select0Provider.WithTempQueryParser(_select, this, selector, ret._tables[0]);
|
var parser = new Select0Provider.WithTempQueryParser(_select, this, selector, ret._tables[0]);
|
||||||
var sql = this.ToSql(parser._insideSelectList[0].InsideField);
|
var sql = $"\r\n{this.ToSql(parser._insideSelectList[0].InsideField)}";
|
||||||
ret.WithSql(sql);
|
ret.WithSql(sql);
|
||||||
ret._diymemexpWithTempQuery = parser;
|
ret._diymemexpWithTempQuery = parser;
|
||||||
return ret;
|
return ret;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user