- 优化 pgsql jsonb 映射,支持 List,mysql limit in 子查询;

This commit is contained in:
2881099
2021-11-02 00:38:06 +08:00
parent 65fe03a2ff
commit 3d5ca9bc7e
25 changed files with 192 additions and 22 deletions

View File

@ -1008,6 +1008,14 @@ FROM `tb_topic` a
WHERE (((cast(a.`Id` as char)) in (SELECT b.`Title`
FROM `tb_topic` b)))", subquery);
var subqueryList = select.Where(a => select.As("b").ToList(b => b.Title).Contains(a.Id.ToString())).ToList();
subquery = select.Where(a => select.As("b").Limit(10).ToList(b => b.Title).Contains(a.Id.ToString())).ToSql();
Assert.Equal(@"SELECT a.`Id`, a.`Clicks`, a.`TypeGuid`, a.`Title`, a.`CreateTime`
FROM `tb_topic` a
WHERE (((cast(a.`Id` as char)) in ( SELECT * FROM (SELECT b.`Title`
FROM `tb_topic` b
limit 0,10) ftblmt50 )))", subquery);
subqueryList = select.Where(a => select.As("b").Limit(10).ToList(b => b.Title).Contains(a.Id.ToString())).ToList();
}
[Fact]
public void As()

View File

@ -933,6 +933,14 @@ FROM ""TB_TOPIC22"" a
WHERE (((to_char(a.""ID"")) in (SELECT b.""TITLE""
FROM ""TB_TOPIC22"" b)))", subquery);
var subqueryList = select.Where(a => select.As("b").ToList(b => b.Title).Contains(a.Id.ToString())).ToList();
subquery = select.Where(a => select.As("b").Limit(10).ToList(b => b.Title).Contains(a.Id.ToString())).ToSql();
Assert.Equal(@"SELECT a.""ID"", a.""CLICKS"", a.""TYPEGUID"", a.""TITLE"", a.""CREATETIME""
FROM ""TB_TOPIC22"" a
WHERE (((to_char(a.""ID"")) in (SELECT b.""TITLE""
FROM ""TB_TOPIC22"" b
WHERE ROWNUM < 11)))", subquery);
subqueryList = select.Where(a => select.As("b").Limit(10).ToList(b => b.Title).Contains(a.Id.ToString())).ToList();
}
[Fact]
public void As()

View File

@ -1019,6 +1019,14 @@ FROM `tb_topic` a
WHERE (((cast(a.`Id` as char)) in (SELECT b.`Title`
FROM `tb_topic` b)))", subquery);
var subqueryList = select.Where(a => select.As("b").ToList(b => b.Title).Contains(a.Id.ToString())).ToList();
subquery = select.Where(a => select.As("b").Limit(10).ToList(b => b.Title).Contains(a.Id.ToString())).ToSql();
Assert.Equal(@"SELECT a.`Id`, a.`Clicks`, a.`TypeGuid`, a.`Title`, a.`CreateTime`
FROM `tb_topic` a
WHERE (((cast(a.`Id` as char)) in ( SELECT * FROM (SELECT b.`Title`
FROM `tb_topic` b
limit 0,10) ftblmt50 )))", subquery);
subqueryList = select.Where(a => select.As("b").Limit(10).ToList(b => b.Title).Contains(a.Id.ToString())).ToList();
}
[Fact]
public void As()

View File

@ -934,6 +934,14 @@ FROM ""TB_TOPIC22"" a
WHERE (((to_char(a.""ID"")) in (SELECT b.""TITLE""
FROM ""TB_TOPIC22"" b)))", subquery);
var subqueryList = select.Where(a => select.As("b").ToList(b => b.Title).Contains(a.Id.ToString())).ToList();
subquery = select.Where(a => select.As("b").Limit(10).ToList(b => b.Title).Contains(a.Id.ToString())).ToSql();
Assert.Equal(@"SELECT a.""ID"", a.""CLICKS"", a.""TYPEGUID"", a.""TITLE"", a.""CREATETIME""
FROM ""TB_TOPIC22"" a
WHERE (((to_char(a.""ID"")) in (SELECT b.""TITLE""
FROM ""TB_TOPIC22"" b
WHERE ROWNUM < 11)))", subquery);
subqueryList = select.Where(a => select.As("b").Limit(10).ToList(b => b.Title).Contains(a.Id.ToString())).ToList();
}
[Fact]
public void As()

View File

@ -995,6 +995,14 @@ FROM ""tb_topic"" a
WHERE ((((a.""id"")::text) in (SELECT b.""title""
FROM ""tb_topic"" b)))", subquery);
var subqueryList = select.Where(a => select.As("b").ToList(b => b.Title).Contains(a.Id.ToString())).ToList();
subquery = select.Where(a => select.As("b").Limit(10).ToList(b => b.Title).Contains(a.Id.ToString())).ToSql();
Assert.Equal(@"SELECT a.""id"", a.""clicks"", a.""typeguid"", a.""title"", a.""createtime""
FROM ""tb_topic"" a
WHERE ((((a.""id"")::text) in (SELECT b.""title""
FROM ""tb_topic"" b
limit 10)))", subquery);
subqueryList = select.Where(a => select.As("b").Limit(10).ToList(b => b.Title).Contains(a.Id.ToString())).ToList();
}
[Fact]
public void As()

View File

@ -6,7 +6,7 @@ using Xunit;
namespace FreeSql.Tests.AdoNetExtensions.OracleConnectionExtensions {
public class Methods {
string _connectString = "user id=user1;password=123456;data source=//127.0.0.1:1521/XE;Pooling=true;Max Pool Size=5";
string _connectString = "user id=1user;password=123456;data source=//127.0.0.1:1521/XE;Pooling=true;Max Pool Size=5";
public Methods() {
g.oracle.CodeFirst.SyncStructure<TestConnectionExt>();

View File

@ -951,6 +951,14 @@ FROM ""TB_TOPIC22"" a
WHERE (((to_char(a.""ID"")) in (SELECT b.""TITLE""
FROM ""TB_TOPIC22"" b)))", subquery);
var subqueryList = select.Where(a => select.As("b").ToList(b => b.Title).Contains(a.Id.ToString())).ToList();
subquery = select.Where(a => select.As("b").Limit(10).ToList(b => b.Title).Contains(a.Id.ToString())).ToSql();
Assert.Equal(@"SELECT a.""ID"", a.""CLICKS"", a.""TYPEGUID"", a.""TITLE"", a.""CREATETIME""
FROM ""TB_TOPIC22"" a
WHERE (((to_char(a.""ID"")) in (SELECT b.""TITLE""
FROM ""TB_TOPIC22"" b
WHERE ROWNUM < 11)))", subquery);
subqueryList = select.Where(a => select.As("b").Limit(10).ToList(b => b.Title).Contains(a.Id.ToString())).ToList();
}
[Fact]
public void As()

View File

@ -934,6 +934,13 @@ FROM ""TB_TOPIC22"" a
WHERE (((cast(a.""ID"" as blob sub_type 1)) in (SELECT b.""TITLE""
FROM ""TB_TOPIC22"" b)))", subquery);
var subqueryList = select.Where(a => select.As("b").ToList(b => b.Title).Contains(a.Id.ToString())).ToList();
subquery = select.Where(a => select.As("b").Limit(10).ToList(b => b.Title).Contains(a.Id.ToString())).ToSql();
Assert.Equal(@"SELECT a.""ID"", a.""CLICKS"", a.""TYPEGUID"", a.""TITLE"", a.""CREATETIME""
FROM ""TB_TOPIC22"" a
WHERE (((cast(a.""ID"" as blob sub_type 1)) in (SELECT FIRST 10 b.""TITLE""
FROM ""TB_TOPIC22"" b)))", subquery);
subqueryList = select.Where(a => select.As("b").Limit(10).ToList(b => b.Title).Contains(a.Id.ToString())).ToList();
}
[Fact]
public void As()

View File

@ -899,6 +899,13 @@ FROM [tb_topic22] a
WHERE (((cstr(a.[Id])) in (SELECT b.[Title]
FROM [tb_topic22] b)))", subquery);
var subqueryList = select.Where(a => select.As("b").ToList(b => b.Title).Contains(a.Id.ToString())).ToList();
subquery = select.Where(a => select.As("b").Limit(10).ToList(b => b.Title).Contains(a.Id.ToString())).ToSql();
Assert.Equal(@"SELECT a.[Id], a.[Clicks], a.[TypeGuid], a.[Title], a.[CreateTime]
FROM [tb_topic22] a
WHERE (((cstr(a.[Id])) in (SELECT TOP 10 b.[Title]
FROM [tb_topic22] b)))", subquery);
subqueryList = select.Where(a => select.As("b").Limit(10).ToList(b => b.Title).Contains(a.Id.ToString())).ToList();
}
[Fact]
public void As()

View File

@ -1071,6 +1071,14 @@ FROM `tb_topic` a
WHERE (((cast(a.`Id` as char)) in (SELECT b.`Title`
FROM `tb_topic` b)))", subquery);
var subqueryList = select.Where(a => select.As("b").ToList(b => b.Title).Contains(a.Id.ToString())).ToList();
subquery = select.Where(a => select.As("b").Limit(10).ToList(b => b.Title).Contains(a.Id.ToString())).ToSql();
Assert.Equal(@"SELECT a.`Id`, a.`Clicks`, a.`TypeGuid`, a.`Title`, a.`CreateTime`
FROM `tb_topic` a
WHERE (((cast(a.`Id` as char)) in ( SELECT * FROM (SELECT b.`Title`
FROM `tb_topic` b
limit 0,10) ftblmt50 )))", subquery);
subqueryList = select.Where(a => select.As("b").Limit(10).ToList(b => b.Title).Contains(a.Id.ToString())).ToList();
}
[Fact]
public void As()

View File

@ -938,6 +938,14 @@ FROM ""TB_TOPIC22"" a
WHERE (((to_char(a.""ID"")) in (SELECT b.""TITLE""
FROM ""TB_TOPIC22"" b)))", subquery);
var subqueryList = select.Where(a => select.As("b").ToList(b => b.Title).Contains(a.Id.ToString())).ToList();
subquery = select.Where(a => select.As("b").Limit(10).ToList(b => b.Title).Contains(a.Id.ToString())).ToSql();
Assert.Equal(@"SELECT a.""ID"", a.""CLICKS"", a.""TYPEGUID"", a.""TITLE"", a.""CREATETIME""
FROM ""TB_TOPIC22"" a
WHERE (((to_char(a.""ID"")) in (SELECT b.""TITLE""
FROM ""TB_TOPIC22"" b
WHERE ROWNUM < 11)))", subquery);
subqueryList = select.Where(a => select.As("b").Limit(10).ToList(b => b.Title).Contains(a.Id.ToString())).ToList();
}
[Fact]
public void As()

View File

@ -1012,6 +1012,14 @@ FROM ""tb_topic"" a
WHERE ((((a.""id"")::text) in (SELECT b.""title""
FROM ""tb_topic"" b)))", subquery);
var subqueryList = select.Where(a => select.As("b").ToList(b => b.Title).Contains(a.Id.ToString())).ToList();
subquery = select.Where(a => select.As("b").Limit(10).ToList(b => b.Title).Contains(a.Id.ToString())).ToSql();
Assert.Equal(@"SELECT a.""id"", a.""clicks"", a.""typeguid"", a.""title"", a.""createtime""
FROM ""tb_topic"" a
WHERE ((((a.""id"")::text) in (SELECT b.""title""
FROM ""tb_topic"" b
limit 10)))", subquery);
subqueryList = select.Where(a => select.As("b").Limit(10).ToList(b => b.Title).Contains(a.Id.ToString())).ToList();
}
[Fact]
public void As()

View File

@ -945,6 +945,13 @@ FROM [tb_topic22] a
WHERE (((cast(a.[Id] as nvarchar(100))) in (SELECT b.[Title]
FROM [tb_topic22] b)))", subquery);
var subqueryList = select.Where(a => select.As("b").ToList(b => b.Title).Contains(a.Id.ToString())).ToList();
subquery = select.Where(a => select.As("b").Limit(10).ToList(b => b.Title).Contains(a.Id.ToString())).ToSql();
Assert.Equal(@"SELECT a.[Id], a.[Clicks], a.[TypeGuid], a.[Title], a.[CreateTime]
FROM [tb_topic22] a
WHERE (((cast(a.[Id] as nvarchar(100))) in (SELECT TOP 10 b.[Title]
FROM [tb_topic22] b)))", subquery);
subqueryList = select.Where(a => select.As("b").Limit(10).ToList(b => b.Title).Contains(a.Id.ToString())).ToList();
}
[Fact]
public void As()

View File

@ -922,6 +922,14 @@ FROM ""tb_topic22"" a
WHERE (((cast(a.""Id"" as character)) in (SELECT b.""Title""
FROM ""tb_topic22"" b)))", subquery);
var subqueryList = select.Where(a => select.As("b").ToList(b => b.Title).Contains(a.Id.ToString())).ToList();
subquery = select.Where(a => select.As("b").Limit(10).ToList(b => b.Title).Contains(a.Id.ToString())).ToSql();
Assert.Equal(@"SELECT a.""Id"", a.""Clicks"", a.""TypeGuid"", a.""Title"", a.""CreateTime""
FROM ""tb_topic22"" a
WHERE (((cast(a.""Id"" as character)) in (SELECT b.""Title""
FROM ""tb_topic22"" b
limit 0,10)))", subquery);
subqueryList = select.Where(a => select.As("b").Limit(10).ToList(b => b.Title).Contains(a.Id.ToString())).ToList();
}
[Fact]
public void As()

View File

@ -633,7 +633,7 @@ INNER JOIN ""userinfo"" p ON p.""userid"" = o.""userid""", select16Sql2);
.UseLazyLoading(true)
.Build());
ib.Register("db2", () => new FreeSql.FreeSqlBuilder()
.UseConnectionString(FreeSql.DataType.Oracle, "user id=user1;password=123456;data source=//127.0.0.1:1521/XE;Pooling=true;Max Pool Size=3")
.UseConnectionString(FreeSql.DataType.Oracle, "user id=1user;password=123456;data source=//127.0.0.1:1521/XE;Pooling=true;Max Pool Size=3")
.UseAutoSyncStructure(true)
.UseGenerateCommandParameterWithLambda(true)
.UseLazyLoading(true)

View File

@ -3,6 +3,7 @@ using FreeSql.DataAnnotations;
using FreeSql.Internal;
using FreeSql.Internal.CommonProvider;
using MySql.Data.MySqlClient;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.Diagnostics;
@ -15,6 +16,35 @@ namespace FreeSql.Tests
{
public class UnitTest5
{
[Fact]
public void TestJsonb01()
{
var fsql = g.pgsql;
fsql.Delete<TestJsonb01Cls1>().Where("1=1").ExecuteAffrows();
var item = new TestJsonb01Cls1
{
jsonb01 = new List<int> { 1, 5, 10, 20 },
jsonb02 = new List<long> { 11, 51, 101, 201 },
jsonb03 = new List<string> { "12", "52", "102", "202" },
};
fsql.Insert(item).ExecuteAffrows();
var items = fsql.Select<TestJsonb01Cls1>().ToList();
}
public class TestJsonb01Cls1
{
public Guid id { get; set; }
[Column(MapType = typeof(JArray))]
public List<int> jsonb01 { get; set; }
[Column(MapType = typeof(JToken))]
public List<long> jsonb02 { get; set; }
[Column(MapType = typeof(JToken))]
public List<string> jsonb03 { get; set; }
}
[Fact]
public void DebugUpdateSet01()
{