mirror of
https://github.com/nsnail/FreeSql.git
synced 2025-04-22 02:32:50 +08:00
增加 IncludeMany 变异多级单元测试
This commit is contained in:
parent
fe016c017d
commit
7ac0d62ed7
@ -901,9 +901,48 @@ namespace FreeSql.Tests.MySql {
|
|||||||
Assert.Equal("SELECT a.`Id`, a.`Clicks`, a.`TypeGuid`, a.`Title`, a.`CreateTime` FROM `tb_topicAsTable1` a LEFT JOIN TestTypeInfo b on b.Guid = a.TypeGuid and b.Name = ?bname", sql);
|
Assert.Equal("SELECT a.`Id`, a.`Clicks`, a.`TypeGuid`, a.`Title`, a.`CreateTime` FROM `tb_topicAsTable1` a LEFT JOIN TestTypeInfo b on b.Guid = a.TypeGuid and b.Name = ?bname", sql);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public class TestInclude_OneToManyModel1 {
|
||||||
|
[Column(IsIdentity = true)]
|
||||||
|
public int id { get; set; }
|
||||||
|
public virtual TestInclude_OneToManyModel2 model2 { get; set; }
|
||||||
|
|
||||||
|
public string m1name { get; set; }
|
||||||
|
}
|
||||||
|
public class TestInclude_OneToManyModel2 {
|
||||||
|
[Column(IsPrimary = true)]
|
||||||
|
public int model2id { get; set; }
|
||||||
|
public virtual TestInclude_OneToManyModel1 model1 { get; set; }
|
||||||
|
|
||||||
|
public string m2setting { get; set; }
|
||||||
|
|
||||||
|
public List<TestInclude_OneToManyModel3> childs { get; set; }
|
||||||
|
}
|
||||||
|
public class TestInclude_OneToManyModel3 {
|
||||||
|
[Column(IsIdentity = true)]
|
||||||
|
public int id { get; set; }
|
||||||
|
|
||||||
|
public int model2111Idaaa { get; set; }
|
||||||
|
public string title { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
public void Include_OneToMany() {
|
public void Include_OneToMany() {
|
||||||
|
var model1 = new TestInclude_OneToManyModel1 { m1name = DateTime.Now.Second.ToString() };
|
||||||
|
model1.id = (int)g.mysql.Insert(model1).ExecuteIdentity();
|
||||||
|
var model2 = new TestInclude_OneToManyModel2 { model2id = model1.id, m2setting = DateTime.Now.Second.ToString() };
|
||||||
|
g.mysql.Insert(model2).ExecuteAffrows();
|
||||||
|
|
||||||
|
var model3s = new[] {
|
||||||
|
new TestInclude_OneToManyModel3{ model2111Idaaa = model1.id, title = "testmodel3__111" },
|
||||||
|
new TestInclude_OneToManyModel3{ model2111Idaaa = model1.id, title = "testmodel3__222" },
|
||||||
|
new TestInclude_OneToManyModel3{ model2111Idaaa = model1.id, title = "testmodel3__333" }
|
||||||
|
};
|
||||||
|
Assert.Equal(3, g.mysql.Insert(model3s).ExecuteAffrows());
|
||||||
|
|
||||||
|
var t1 = g.mysql.Select<TestInclude_OneToManyModel1>()
|
||||||
|
.IncludeMany(a => a.model2.childs.Where(m3 => m3.model2111Idaaa == a.model2.model2id))
|
||||||
|
.Where(a => a.id <= model1.id)
|
||||||
|
.ToList();
|
||||||
}
|
}
|
||||||
[Fact]
|
[Fact]
|
||||||
public void Include_OneToChilds() {
|
public void Include_OneToChilds() {
|
||||||
|
@ -794,9 +794,48 @@ namespace FreeSql.Tests.Oracle {
|
|||||||
Assert.Equal("SELECT a.\"ID\", a.\"CLICKS\", a.\"TYPEGUID\", a.\"TITLE\", a.\"CREATETIME\" FROM \"TB_TOPIC22AsTable1\" a LEFT JOIN \"TESTTYPEINFO\" b on b.\"GUID\" = a.\"TYPEGUID\" and b.\"NAME\" = :bname", sql);
|
Assert.Equal("SELECT a.\"ID\", a.\"CLICKS\", a.\"TYPEGUID\", a.\"TITLE\", a.\"CREATETIME\" FROM \"TB_TOPIC22AsTable1\" a LEFT JOIN \"TESTTYPEINFO\" b on b.\"GUID\" = a.\"TYPEGUID\" and b.\"NAME\" = :bname", sql);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public class TiOtmModel1 {
|
||||||
|
[Column(IsIdentity = true)]
|
||||||
|
public int id { get; set; }
|
||||||
|
public virtual TiOtmModel2 model2 { get; set; }
|
||||||
|
|
||||||
|
public string m1name { get; set; }
|
||||||
|
}
|
||||||
|
public class TiOtmModel2 {
|
||||||
|
[Column(IsPrimary = true)]
|
||||||
|
public int model2id { get; set; }
|
||||||
|
public virtual TiOtmModel1 model1 { get; set; }
|
||||||
|
|
||||||
|
public string m2setting { get; set; }
|
||||||
|
|
||||||
|
public List<TiOtmModel3> childs { get; set; }
|
||||||
|
}
|
||||||
|
public class TiOtmModel3 {
|
||||||
|
[Column(IsIdentity = true)]
|
||||||
|
public int id { get; set; }
|
||||||
|
|
||||||
|
public int model2111Idaaa { get; set; }
|
||||||
|
public string title { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
public void Include_OneToMany() {
|
public void Include_OneToMany() {
|
||||||
|
var model1 = new TiOtmModel1 { m1name = DateTime.Now.Second.ToString() };
|
||||||
|
model1.id = (int)g.oracle.Insert(model1).ExecuteIdentity();
|
||||||
|
var model2 = new TiOtmModel2 { model2id = model1.id, m2setting = DateTime.Now.Second.ToString() };
|
||||||
|
g.oracle.Insert(model2).ExecuteAffrows();
|
||||||
|
|
||||||
|
var model3s = new[] {
|
||||||
|
new TiOtmModel3{ model2111Idaaa = model1.id, title = "testmodel3__111" },
|
||||||
|
new TiOtmModel3{ model2111Idaaa = model1.id, title = "testmodel3__222" },
|
||||||
|
new TiOtmModel3{ model2111Idaaa = model1.id, title = "testmodel3__333" }
|
||||||
|
};
|
||||||
|
Assert.Equal(3, g.oracle.Insert(model3s).ExecuteAffrows());
|
||||||
|
|
||||||
|
var t1 = g.oracle.Select<TiOtmModel1>()
|
||||||
|
.IncludeMany(a => a.model2.childs.Where(m3 => m3.model2111Idaaa == a.model2.model2id))
|
||||||
|
.Where(a => a.id <= model1.id)
|
||||||
|
.ToList();
|
||||||
}
|
}
|
||||||
[Fact]
|
[Fact]
|
||||||
public void Include_OneToChilds() {
|
public void Include_OneToChilds() {
|
||||||
|
@ -860,9 +860,48 @@ namespace FreeSql.Tests.PostgreSQL {
|
|||||||
Assert.Equal("SELECT a.\"id\", a.\"clicks\", a.\"typeguid\", a.\"title\", a.\"createtime\" FROM \"tb_topicAsTable1\" a LEFT JOIN \"testtypeinfo\" b on b.\"guid\" = a.\"typeguid\" and b.\"name\" = @bname", sql);
|
Assert.Equal("SELECT a.\"id\", a.\"clicks\", a.\"typeguid\", a.\"title\", a.\"createtime\" FROM \"tb_topicAsTable1\" a LEFT JOIN \"testtypeinfo\" b on b.\"guid\" = a.\"typeguid\" and b.\"name\" = @bname", sql);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public class TestInclude_OneToManyModel1 {
|
||||||
|
[Column(IsIdentity = true)]
|
||||||
|
public int id { get; set; }
|
||||||
|
public virtual TestInclude_OneToManyModel2 model2 { get; set; }
|
||||||
|
|
||||||
|
public string m1name { get; set; }
|
||||||
|
}
|
||||||
|
public class TestInclude_OneToManyModel2 {
|
||||||
|
[Column(IsPrimary = true)]
|
||||||
|
public int model2id { get; set; }
|
||||||
|
public virtual TestInclude_OneToManyModel1 model1 { get; set; }
|
||||||
|
|
||||||
|
public string m2setting { get; set; }
|
||||||
|
|
||||||
|
public List<TestInclude_OneToManyModel3> childs { get; set; }
|
||||||
|
}
|
||||||
|
public class TestInclude_OneToManyModel3 {
|
||||||
|
[Column(IsIdentity = true)]
|
||||||
|
public int id { get; set; }
|
||||||
|
|
||||||
|
public int model2111Idaaa { get; set; }
|
||||||
|
public string title { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
public void Include_OneToMany() {
|
public void Include_OneToMany() {
|
||||||
|
var model1 = new TestInclude_OneToManyModel1 { m1name = DateTime.Now.Second.ToString() };
|
||||||
|
model1.id = (int)g.pgsql.Insert(model1).ExecuteIdentity();
|
||||||
|
var model2 = new TestInclude_OneToManyModel2 { model2id = model1.id, m2setting = DateTime.Now.Second.ToString() };
|
||||||
|
g.pgsql.Insert(model2).ExecuteAffrows();
|
||||||
|
|
||||||
|
var model3s = new[] {
|
||||||
|
new TestInclude_OneToManyModel3{ model2111Idaaa = model1.id, title = "testmodel3__111" },
|
||||||
|
new TestInclude_OneToManyModel3{ model2111Idaaa = model1.id, title = "testmodel3__222" },
|
||||||
|
new TestInclude_OneToManyModel3{ model2111Idaaa = model1.id, title = "testmodel3__333" }
|
||||||
|
};
|
||||||
|
Assert.Equal(3, g.pgsql.Insert(model3s).ExecuteAffrows());
|
||||||
|
|
||||||
|
var t1 = g.pgsql.Select<TestInclude_OneToManyModel1>()
|
||||||
|
.IncludeMany(a => a.model2.childs.Where(m3 => m3.model2111Idaaa == a.model2.model2id))
|
||||||
|
.Where(a => a.id <= model1.id)
|
||||||
|
.ToList();
|
||||||
}
|
}
|
||||||
[Fact]
|
[Fact]
|
||||||
public void Include_OneToChilds() {
|
public void Include_OneToChilds() {
|
||||||
|
@ -791,9 +791,48 @@ namespace FreeSql.Tests.SqlServer {
|
|||||||
Assert.Equal("SELECT a.[Id], a.[Clicks], a.[TypeGuid], a.[Title], a.[CreateTime] FROM [tb_topic22AsTable1] a LEFT JOIN TestTypeInfo b on b.Guid = a.TypeGuid and b.Name = @bname", sql);
|
Assert.Equal("SELECT a.[Id], a.[Clicks], a.[TypeGuid], a.[Title], a.[CreateTime] FROM [tb_topic22AsTable1] a LEFT JOIN TestTypeInfo b on b.Guid = a.TypeGuid and b.Name = @bname", sql);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public class TestInclude_OneToManyModel1 {
|
||||||
|
[Column(IsIdentity = true)]
|
||||||
|
public int id { get; set; }
|
||||||
|
public virtual TestInclude_OneToManyModel2 model2 { get; set; }
|
||||||
|
|
||||||
|
public string m1name { get; set; }
|
||||||
|
}
|
||||||
|
public class TestInclude_OneToManyModel2 {
|
||||||
|
[Column(IsPrimary = true)]
|
||||||
|
public int model2id { get; set; }
|
||||||
|
public virtual TestInclude_OneToManyModel1 model1 { get; set; }
|
||||||
|
|
||||||
|
public string m2setting { get; set; }
|
||||||
|
|
||||||
|
public List<TestInclude_OneToManyModel3> childs { get; set; }
|
||||||
|
}
|
||||||
|
public class TestInclude_OneToManyModel3 {
|
||||||
|
[Column(IsIdentity = true)]
|
||||||
|
public int id { get; set; }
|
||||||
|
|
||||||
|
public int model2111Idaaa { get; set; }
|
||||||
|
public string title { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
public void Include_OneToMany() {
|
public void Include_OneToMany() {
|
||||||
|
var model1 = new TestInclude_OneToManyModel1 { m1name = DateTime.Now.Second.ToString() };
|
||||||
|
model1.id = (int)_sqlserverFixture.SqlServer.Insert(model1).ExecuteIdentity();
|
||||||
|
var model2 = new TestInclude_OneToManyModel2 { model2id = model1.id, m2setting = DateTime.Now.Second.ToString() };
|
||||||
|
_sqlserverFixture.SqlServer.Insert(model2).ExecuteAffrows();
|
||||||
|
|
||||||
|
var model3s = new[] {
|
||||||
|
new TestInclude_OneToManyModel3{ model2111Idaaa = model1.id, title = "testmodel3__111" },
|
||||||
|
new TestInclude_OneToManyModel3{ model2111Idaaa = model1.id, title = "testmodel3__222" },
|
||||||
|
new TestInclude_OneToManyModel3{ model2111Idaaa = model1.id, title = "testmodel3__333" }
|
||||||
|
};
|
||||||
|
Assert.Equal(3, _sqlserverFixture.SqlServer.Insert(model3s).ExecuteAffrows());
|
||||||
|
|
||||||
|
var t1 = _sqlserverFixture.SqlServer.Select<TestInclude_OneToManyModel1>()
|
||||||
|
.IncludeMany(a => a.model2.childs.Where(m3 => m3.model2111Idaaa == a.model2.model2id))
|
||||||
|
.Where(a => a.id <= model1.id)
|
||||||
|
.ToList();
|
||||||
}
|
}
|
||||||
[Fact]
|
[Fact]
|
||||||
public void Include_OneToChilds() {
|
public void Include_OneToChilds() {
|
||||||
|
@ -757,29 +757,48 @@ namespace FreeSql.Tests.Sqlite {
|
|||||||
Assert.Equal("SELECT a.\"Id\", a.\"Clicks\", a.\"TypeGuid\", a.\"Title\", a.\"CreateTime\" FROM \"tb_topic22AsTable1\" a LEFT JOIN \"TestTypeInfo\" b on b.\"Guid\" = a.\"TypeGuid\" and b.\"Name\" = @bname", sql);
|
Assert.Equal("SELECT a.\"Id\", a.\"Clicks\", a.\"TypeGuid\", a.\"Title\", a.\"CreateTime\" FROM \"tb_topic22AsTable1\" a LEFT JOIN \"TestTypeInfo\" b on b.\"Guid\" = a.\"TypeGuid\" and b.\"Name\" = @bname", sql);
|
||||||
}
|
}
|
||||||
|
|
||||||
class TestInclude_OneToManyModel1 {
|
public class TestInclude_OneToManyModel1 {
|
||||||
[Column(IsIdentity = true)]
|
[Column(IsIdentity = true)]
|
||||||
public int id { get; set; }
|
public int id { get; set; }
|
||||||
public virtual TestInclude_OneToManyModel2 model2 { get; set; }
|
public virtual TestInclude_OneToManyModel2 model2 { get; set; }
|
||||||
|
|
||||||
|
public string m1name { get; set; }
|
||||||
}
|
}
|
||||||
class TestInclude_OneToManyModel2 {
|
public class TestInclude_OneToManyModel2 {
|
||||||
[Column(IsPrimary = true)]
|
[Column(IsPrimary = true)]
|
||||||
public int model2id { get; set; }
|
public int model2id { get; set; }
|
||||||
public virtual TestInclude_OneToManyModel2 model1 { get; set; }
|
public virtual TestInclude_OneToManyModel1 model1 { get; set; }
|
||||||
|
|
||||||
public virtual List<TestInclude_OneToManyModel3> childs { get; set; }
|
public string m2setting { get; set; }
|
||||||
|
|
||||||
|
public List<TestInclude_OneToManyModel3> childs { get; set; }
|
||||||
}
|
}
|
||||||
class TestInclude_OneToManyModel3 {
|
public class TestInclude_OneToManyModel3 {
|
||||||
[Column(IsIdentity = true)]
|
[Column(IsIdentity = true)]
|
||||||
public int id { get; set; }
|
public int id { get; set; }
|
||||||
|
|
||||||
|
public int model2111Idaaa { get; set; }
|
||||||
public string title { get; set; }
|
public string title { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
public void Include_OneToMany() {
|
public void Include_OneToMany() {
|
||||||
var model1 = new TestInclude_OneToManyModel1 { };
|
var model1 = new TestInclude_OneToManyModel1 { m1name = DateTime.Now.Second.ToString() };
|
||||||
model1.id = (int)g.sqlite.Insert(model1).ExecuteIdentity();
|
model1.id = (int)g.sqlite.Insert(model1).ExecuteIdentity();
|
||||||
|
var model2 = new TestInclude_OneToManyModel2 { model2id = model1.id, m2setting = DateTime.Now.Second.ToString() };
|
||||||
|
g.sqlite.Insert(model2).ExecuteAffrows();
|
||||||
|
|
||||||
|
var model3s = new [] {
|
||||||
|
new TestInclude_OneToManyModel3{ model2111Idaaa = model1.id, title = "testmodel3__111" },
|
||||||
|
new TestInclude_OneToManyModel3{ model2111Idaaa = model1.id, title = "testmodel3__222" },
|
||||||
|
new TestInclude_OneToManyModel3{ model2111Idaaa = model1.id, title = "testmodel3__333" }
|
||||||
|
};
|
||||||
|
Assert.Equal(3, g.sqlite.Insert(model3s).ExecuteAffrows());
|
||||||
|
|
||||||
|
var t1 = g.sqlite.Select<TestInclude_OneToManyModel1>()
|
||||||
|
.IncludeMany(a => a.model2.childs.Where(m3 => m3.model2111Idaaa == a.model2.model2id && m3.title == a.model2.m2setting))
|
||||||
|
.Where(a => a.id <= model1.id)
|
||||||
|
.ToList();
|
||||||
}
|
}
|
||||||
[Fact]
|
[Fact]
|
||||||
public void Include_OneToChilds() {
|
public void Include_OneToChilds() {
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>netstandard2.0</TargetFramework>
|
<TargetFramework>netstandard2.0</TargetFramework>
|
||||||
<Version>0.5.17</Version>
|
<Version>0.5.18</Version>
|
||||||
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
|
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
|
||||||
<Authors>YeXiangQin</Authors>
|
<Authors>YeXiangQin</Authors>
|
||||||
<Description>FreeSql is the most convenient ORM in dotnet. It supports Mysql, Postgresql, SqlServer, Oracle and Sqlite.</Description>
|
<Description>FreeSql is the most convenient ORM in dotnet. It supports Mysql, Postgresql, SqlServer, Oracle and Sqlite.</Description>
|
||||||
|
@ -467,20 +467,39 @@ namespace FreeSql.Internal.CommonProvider {
|
|||||||
subSelect.Where(Expression.Lambda<Func<TNavigate, bool>>(
|
subSelect.Where(Expression.Lambda<Func<TNavigate, bool>>(
|
||||||
Expression.Call(null, containsMethod, arrExp, refCol), otmExpParm1));
|
Expression.Call(null, containsMethod, arrExp, refCol), otmExpParm1));
|
||||||
} else {
|
} else {
|
||||||
var otmExpParm1 = Expression.Parameter(typeof(TNavigate), "a");
|
var subSelectT1Alias = (subSelect as Select1Provider<TNavigate>)._tables[0].Alias;
|
||||||
Expression expOr = null;
|
Dictionary<string, bool> sbDic = new Dictionary<string, bool>();
|
||||||
foreach (var item in list) {
|
for (var y = 0; y < list.Count; y++) {
|
||||||
Expression expAnd = null;
|
var sbWhereOne = new StringBuilder();
|
||||||
|
sbWhereOne.Append("(");
|
||||||
for (var z = 0; z < tbref.Columns.Count; z++) {
|
for (var z = 0; z < tbref.Columns.Count; z++) {
|
||||||
var colVal = getListValue(item, tbref.Columns[z].CsName);
|
if (z > 0) sbWhereOne.Append(" AND ");
|
||||||
var expTmp = Expression.Equal(Expression.MakeMemberAccess(otmExpParm1, tbref2.Properties[tbref.RefColumns[0].CsName]), Expression.Constant(colVal));
|
sbWhereOne.Append(_commonUtils.FormatSql($"{subSelectT1Alias}.{_commonUtils.QuoteSqlName(tbref.RefColumns[z].Attribute.Name)}={{0}}", getListValue(list[y], tbref.Columns[z].CsName)));
|
||||||
if (z == 0) expAnd = expTmp;
|
|
||||||
else expAnd = Expression.AndAlso(expAnd, expTmp);
|
|
||||||
}
|
}
|
||||||
if (expOr == null) expOr = expAnd;
|
sbWhereOne.Append(")");
|
||||||
else expOr = Expression.OrElse(expOr, expAnd);
|
var whereOne = sbWhereOne.ToString();
|
||||||
|
sbWhereOne.Clear();
|
||||||
|
if (sbDic.ContainsKey(whereOne) == false) sbDic.Add(whereOne, true);
|
||||||
}
|
}
|
||||||
subSelect.Where(Expression.Lambda<Func<TNavigate, bool>>(expOr, otmExpParm1));
|
var sbWhere = new StringBuilder();
|
||||||
|
foreach (var sbd in sbDic)
|
||||||
|
sbWhere.Append(" OR ").Append(sbd.Key);
|
||||||
|
subSelect.Where(sbWhere.Remove(0, 4).ToString());
|
||||||
|
sbWhere.Clear();
|
||||||
|
//var otmExpParm1 = Expression.Parameter(typeof(TNavigate), "a");
|
||||||
|
//Expression expOr = null;
|
||||||
|
//foreach (var item in list) {
|
||||||
|
// Expression expAnd = null;
|
||||||
|
// for (var z = 0; z < tbref.Columns.Count; z++) {
|
||||||
|
// var colVal = getListValue(item, tbref.Columns[z].CsName);
|
||||||
|
// var expTmp = Expression.Equal(Expression.MakeMemberAccess(otmExpParm1, tbref2.Properties[tbref.RefColumns[z].CsName]), Expression.Constant(colVal));
|
||||||
|
// if (z == 0) expAnd = expTmp;
|
||||||
|
// else expAnd = Expression.AndAlso(expAnd, expTmp);
|
||||||
|
// }
|
||||||
|
// if (expOr == null) expOr = expAnd;
|
||||||
|
// else expOr = Expression.OrElse(expOr, expAnd);
|
||||||
|
//}
|
||||||
|
//subSelect.Where(Expression.Lambda<Func<TNavigate, bool>>(expOr, otmExpParm1));
|
||||||
}
|
}
|
||||||
then?.Invoke(subSelect);
|
then?.Invoke(subSelect);
|
||||||
var subList = subSelect.ToList(true);
|
var subList = subSelect.ToList(true);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user