From ce1fabd7128eb622f9a4345e0e6a98c9116a63e9 Mon Sep 17 00:00:00 2001 From: 2881099 <2881099@qq.com> Date: Tue, 26 Jul 2022 11:12:43 +0800 Subject: [PATCH] =?UTF-8?q?fix=20FromQuery=20=E5=88=AB=E5=90=8D=20bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FreeSql.DbContext/FreeSql.DbContext.xml | 9 --- .../Curd/SqlServerSelectWithTempQueryTest.cs | 61 +++++++++++++++++++ .../SelectProvider/Select0Provider.cs | 6 +- 3 files changed, 65 insertions(+), 11 deletions(-) diff --git a/FreeSql.DbContext/FreeSql.DbContext.xml b/FreeSql.DbContext/FreeSql.DbContext.xml index 537315e2..594fbad3 100644 --- a/FreeSql.DbContext/FreeSql.DbContext.xml +++ b/FreeSql.DbContext/FreeSql.DbContext.xml @@ -733,15 +733,6 @@ - - - 根据Assembly扫描所有继承IEntityTypeConfiguration<T>的配置类 - - - - - - 创建普通数据上下文档对象 diff --git a/FreeSql.Tests/FreeSql.Tests/SqlServer/Curd/SqlServerSelectWithTempQueryTest.cs b/FreeSql.Tests/FreeSql.Tests/SqlServer/Curd/SqlServerSelectWithTempQueryTest.cs index bb1193d0..13faa858 100644 --- a/FreeSql.Tests/FreeSql.Tests/SqlServer/Curd/SqlServerSelectWithTempQueryTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/SqlServer/Curd/SqlServerSelectWithTempQueryTest.cs @@ -903,6 +903,67 @@ LEFT JOIN ( WHERE (a.[Id] > 0 AND b.[UserId] > 0) GROUP BY a.[Nickname]"; Assert.Equal(sql13, assertSql13); + + + var sql14 = fsql.Select() + .Where(a => a.Id > 0) + .WithTempQuery(a => new + { + item = a, + rownum = SqlExt.RowNumber().Over().PartitionBy(a.Nickname).OrderBy(a.Id).ToValue() + }) + .Where(a => a.rownum == 1) + .FromQuery(fsql.Select().Where(b => b.UserId > 0)) + .InnerJoin((a, b) => a.item.Id == b.UserId) + .ToSql((a, b) => new + { + user = a.item, + rownum = a.rownum, + userext = b + }); + var assertSql14 = @"SELECT a.[Id] as1, a.[Nickname] as2, a.[rownum] as3, b.[UserId] as4, b.[Remark] as5 +FROM ( + SELECT a.[Id], a.[Nickname], row_number() over( partition by a.[Nickname] order by a.[Id]) [rownum] + FROM [TwoTablePartitionBy_User] a + WHERE (a.[Id] > 0) ) a +INNER JOIN ( + SELECT a.[UserId], a.[Remark] + FROM [TwoTablePartitionBy_UserExt] a + WHERE (a.[UserId] > 0)) b ON a.[Id] = b.[UserId] +WHERE (a.[rownum] = 1)"; + Assert.Equal(sql14, assertSql14); + var list14 = fsql.Select() + .Where(a => a.Id > 0) + .WithTempQuery(a => new + { + item = a, + rownum = SqlExt.RowNumber().Over().PartitionBy(a.Nickname).OrderBy(a.Id).ToValue() + }) + .Where(a => a.rownum == 1) + .FromQuery(fsql.Select().Where(b => b.UserId > 0)) + .InnerJoin((a, b) => a.item.Id == b.UserId) + .ToList((a, b) => new + { + user = a.item, + rownum = a.rownum, + userext = b + }); + Assert.Equal(list14.Count, 3); + Assert.Equal(list14[0].rownum, 1); + Assert.Equal(list14[0].user.Id, 1); + Assert.Equal(list14[0].user.Nickname, "name01"); + Assert.Equal(list14[0].userext.UserId, 1); + Assert.Equal(list14[0].userext.Remark, "remark01"); + Assert.Equal(list14[1].rownum, 1); + Assert.Equal(list14[1].user.Id, 4); + Assert.Equal(list14[1].user.Nickname, "name02"); + Assert.Equal(list14[1].userext.UserId, 4); + Assert.Equal(list14[1].userext.Remark, "remark04"); + Assert.Equal(list14[2].rownum, 1); + Assert.Equal(list14[2].user.Id, 5); + Assert.Equal(list14[2].user.Nickname, "name03"); + Assert.Equal(list14[2].userext.UserId, 5); + Assert.Equal(list14[2].userext.Remark, "remark05"); } class TwoTablePartitionBy_User { diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs index 29c9d6a0..8fe90a58 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs @@ -203,6 +203,8 @@ namespace FreeSql.Internal.CommonProvider { ParseExpMapResult = null; ParseExpMatchedTable = GetOutsideSelectTable(members.FirstOrDefault()?.GetParameter()); + if (ParseExpMatchedTable == null) return null; + var insideIndex = _outsideTable.FindIndex(a => a == ParseExpMatchedTable); if (insideIndex == -1) { @@ -226,14 +228,14 @@ namespace FreeSql.Internal.CommonProvider } public SelectTableInfo GetOutsideSelectTable(ParameterExpression parameterExp) { - if (parameterExp == null) return _outsideTable[0]; + if (parameterExp == null) return null; var find = _outsideTable.Where(a => a.Parameter == parameterExp).ToArray(); if (find.Length == 1) return find[0]; find = _outsideTable.Where(a => a.Table.Type == parameterExp.Type).ToArray(); if (find.Length == 1) return find[0]; find = _outsideTable.Where(a => a.Alias == parameterExp.Name).ToArray(); if (find.Length == 1) return find[0]; - return _outsideTable[0]; + return null; } }