mirror of
https://github.com/nsnail/FreeSql.git
synced 2025-04-22 18:52:50 +08:00
- 增加 ISelect ToChunk 停止读取的逻辑控制 #360;
This commit is contained in:
parent
f2f1495efc
commit
cd60c9dbd9
@ -365,9 +365,9 @@ namespace orm_vs
|
||||
|
||||
var testlist1 = fsql.Select<Song>().OrderBy(a => a.id).ToList();
|
||||
var testlist2 = new List<Song>();
|
||||
fsql.Select<Song>().OrderBy(a => a.id).ToChunk(0, list =>
|
||||
fsql.Select<Song>().OrderBy(a => a.id).ToChunk(2, fetch =>
|
||||
{
|
||||
testlist2.AddRange(list);
|
||||
testlist2.AddRange(fetch.Object);
|
||||
});
|
||||
|
||||
//sugar.Aop.OnLogExecuted = (s, e) =>
|
||||
|
@ -125,6 +125,13 @@
|
||||
清空状态数据
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:FreeSql.DbSet`1.RemoveAsync(System.Linq.Expressions.Expression{System.Func{`0,System.Boolean}})">
|
||||
<summary>
|
||||
根据 lambda 条件删除数据
|
||||
</summary>
|
||||
<param name="predicate"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:FreeSql.DbSet`1.Add(`0)">
|
||||
<summary>
|
||||
添加
|
||||
@ -479,5 +486,14 @@
|
||||
<param name="that"></param>
|
||||
<returns></returns>
|
||||
</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>
|
||||
</doc>
|
||||
|
@ -170,14 +170,14 @@ namespace FreeSql.Tests.PerformanceTest
|
||||
|
||||
time.Restart();
|
||||
var adolist1 = new List<xxx>();
|
||||
g.mysql.Ado.ExecuteReader(dr =>
|
||||
g.mysql.Ado.ExecuteReader(fetch =>
|
||||
{
|
||||
var xim = new xxx();
|
||||
dr.GetValue(0);
|
||||
dr.GetValue(1);
|
||||
dr.GetValue(2);
|
||||
dr.GetValue(3);
|
||||
dr.GetValue(4);
|
||||
fetch.Object.GetValue(0);
|
||||
fetch.Object.GetValue(1);
|
||||
fetch.Object.GetValue(2);
|
||||
fetch.Object.GetValue(3);
|
||||
fetch.Object.GetValue(4);
|
||||
adolist1.Add(xim);
|
||||
}, "select * from freesql_song");
|
||||
time.Stop();
|
||||
@ -185,14 +185,14 @@ namespace FreeSql.Tests.PerformanceTest
|
||||
|
||||
time.Restart();
|
||||
adolist1 = new List<xxx>();
|
||||
g.mysql.Ado.ExecuteReader(dr =>
|
||||
g.mysql.Ado.ExecuteReader(fetch =>
|
||||
{
|
||||
var xim = new xxx();
|
||||
dr.GetFieldValue<int>(0);
|
||||
dr.GetFieldValue<DateTime>(1);
|
||||
dr.GetFieldValue<bool>(2);
|
||||
dr.GetFieldValue<string>(3);
|
||||
dr.GetFieldValue<string>(4);
|
||||
fetch.Object.GetFieldValue<int>(0);
|
||||
fetch.Object.GetFieldValue<DateTime>(1);
|
||||
fetch.Object.GetFieldValue<bool>(2);
|
||||
fetch.Object.GetFieldValue<string>(3);
|
||||
fetch.Object.GetFieldValue<string>(4);
|
||||
adolist1.Add(xim);
|
||||
}, "select * from freesql_song");
|
||||
time.Stop();
|
||||
|
@ -21,10 +21,10 @@ namespace FreeSql.Tests.MySqlConnector
|
||||
{
|
||||
g.mysql.Delete<TestOnDuplicateKeyUpdateInfo>(new[] { 100, 101, 102 }).ExecuteAffrows();
|
||||
var odku1 = g.mysql.Insert(new TestOnDuplicateKeyUpdateInfo { id = 100, title = "title-100", time = DateTime.Parse("2000-01-01") }).NoneParameter().OnDuplicateKeyUpdate();
|
||||
Assert.Equal(odku1.ToSql(), @"INSERT INTO `TestOnDuplicateKeyUpdateInfo`(`id`, `title`, `time`) VALUES(100, 'title-100', '2000-01-01 00:00:00.000')
|
||||
Assert.Equal(@"INSERT INTO `TestOnDuplicateKeyUpdateInfo`(`id`, `title`, `time`) VALUES(100, 'title-100', '2000-01-01 00:00:00.000')
|
||||
ON DUPLICATE KEY UPDATE
|
||||
`title` = VALUES(`title`),
|
||||
`time` = VALUES(`time`)");
|
||||
`time` = VALUES(`time`)", odku1.ToSql());
|
||||
Assert.Equal(1, odku1.ExecuteAffrows());
|
||||
|
||||
var odku2 = g.mysql.Insert(new[] {
|
||||
@ -32,10 +32,10 @@ ON DUPLICATE KEY UPDATE
|
||||
new TestOnDuplicateKeyUpdateInfo { id = 101, title = "title-101", time = DateTime.Parse("2000-01-01") },
|
||||
new TestOnDuplicateKeyUpdateInfo { id = 102, title = "title-102", time = DateTime.Parse("2000-01-01") }
|
||||
}).NoneParameter().OnDuplicateKeyUpdate();
|
||||
Assert.Equal(odku2.ToSql(), @"INSERT INTO `TestOnDuplicateKeyUpdateInfo`(`id`, `title`, `time`) VALUES(100, 'title-100', '2000-01-01 00:00:00.000'), (101, 'title-101', '2000-01-01 00:00:00.000'), (102, 'title-102', '2000-01-01 00:00:00.000')
|
||||
Assert.Equal(@"INSERT INTO `TestOnDuplicateKeyUpdateInfo`(`id`, `title`, `time`) VALUES(100, 'title-100', '2000-01-01 00:00:00.000'), (101, 'title-101', '2000-01-01 00:00:00.000'), (102, 'title-102', '2000-01-01 00:00:00.000')
|
||||
ON DUPLICATE KEY UPDATE
|
||||
`title` = VALUES(`title`),
|
||||
`time` = VALUES(`time`)");
|
||||
`time` = VALUES(`time`)", odku2.ToSql());
|
||||
odku2.ExecuteAffrows();
|
||||
}
|
||||
|
||||
@ -44,10 +44,10 @@ ON DUPLICATE KEY UPDATE
|
||||
{
|
||||
g.mysql.Delete<TestOnDuplicateKeyUpdateInfo>(new[] { 200, 201, 202 }).ExecuteAffrows();
|
||||
var odku1 = g.mysql.Insert(new TestOnDuplicateKeyUpdateInfo { id = 200, title = "title-200", time = DateTime.Parse("2000-01-01") }).IgnoreColumns(a => a.time).NoneParameter().OnDuplicateKeyUpdate();
|
||||
Assert.Equal(odku1.ToSql(), @"INSERT INTO `TestOnDuplicateKeyUpdateInfo`(`id`, `title`) VALUES(200, 'title-200')
|
||||
Assert.Equal(@"INSERT INTO `TestOnDuplicateKeyUpdateInfo`(`id`, `title`) VALUES(200, 'title-200')
|
||||
ON DUPLICATE KEY UPDATE
|
||||
`title` = VALUES(`title`),
|
||||
`time` = '2000-01-01 00:00:00.000'");
|
||||
`time` = '2000-01-01 00:00:00.000'", odku1.ToSql());
|
||||
Assert.Equal(1, odku1.ExecuteAffrows());
|
||||
|
||||
var odku2 = g.mysql.Insert(new[] {
|
||||
@ -55,21 +55,21 @@ ON DUPLICATE KEY UPDATE
|
||||
new TestOnDuplicateKeyUpdateInfo { id = 201, title = "title-201", time = DateTime.Parse("2000-01-01") },
|
||||
new TestOnDuplicateKeyUpdateInfo { id = 202, title = "title-202", time = DateTime.Parse("2000-01-01") }
|
||||
}).IgnoreColumns(a => a.time).NoneParameter().OnDuplicateKeyUpdate();
|
||||
Assert.Equal(odku2.ToSql(), @"INSERT INTO `TestOnDuplicateKeyUpdateInfo`(`id`, `title`) VALUES(200, 'title-200'), (201, 'title-201'), (202, 'title-202')
|
||||
Assert.Equal(@"INSERT INTO `TestOnDuplicateKeyUpdateInfo`(`id`, `title`) VALUES(200, 'title-200'), (201, 'title-201'), (202, 'title-202')
|
||||
ON DUPLICATE KEY UPDATE
|
||||
`title` = VALUES(`title`),
|
||||
`time` = CASE `id`
|
||||
WHEN 200 THEN '2000-01-01 00:00:00.000'
|
||||
WHEN 201 THEN '2000-01-01 00:00:00.000'
|
||||
WHEN 202 THEN '2000-01-01 00:00:00.000' END");
|
||||
WHEN 202 THEN '2000-01-01 00:00:00.000' END", odku2.ToSql());
|
||||
odku2.ExecuteAffrows();
|
||||
|
||||
|
||||
g.mysql.Delete<TestOnDuplicateKeyUpdateInfo>(new[] { 200, 201, 202 }).ExecuteAffrows();
|
||||
odku1 = g.mysql.Insert(new TestOnDuplicateKeyUpdateInfo { id = 200, title = "title-200", time = DateTime.Parse("2000-01-01") }).IgnoreColumns(a => a.time).NoneParameter().OnDuplicateKeyUpdate().IgnoreColumns(a => a.title);
|
||||
Assert.Equal(odku1.ToSql(), @"INSERT INTO `TestOnDuplicateKeyUpdateInfo`(`id`, `title`) VALUES(200, 'title-200')
|
||||
Assert.Equal(@"INSERT INTO `TestOnDuplicateKeyUpdateInfo`(`id`, `title`) VALUES(200, 'title-200')
|
||||
ON DUPLICATE KEY UPDATE
|
||||
`time` = '2000-01-01 00:00:00.000'");
|
||||
`time` = '2000-01-01 00:00:00.000'", odku1.ToSql());
|
||||
Assert.Equal(1, odku1.ExecuteAffrows());
|
||||
|
||||
odku2 = g.mysql.Insert(new[] {
|
||||
@ -77,12 +77,12 @@ ON DUPLICATE KEY UPDATE
|
||||
new TestOnDuplicateKeyUpdateInfo { id = 201, title = "title-201", time = DateTime.Parse("2000-01-01") },
|
||||
new TestOnDuplicateKeyUpdateInfo { id = 202, title = "title-202", time = DateTime.Parse("2000-01-01") }
|
||||
}).IgnoreColumns(a => a.time).NoneParameter().OnDuplicateKeyUpdate().IgnoreColumns(a => a.title);
|
||||
Assert.Equal(odku2.ToSql(), @"INSERT INTO `TestOnDuplicateKeyUpdateInfo`(`id`, `title`) VALUES(200, 'title-200'), (201, 'title-201'), (202, 'title-202')
|
||||
Assert.Equal(@"INSERT INTO `TestOnDuplicateKeyUpdateInfo`(`id`, `title`) VALUES(200, 'title-200'), (201, 'title-201'), (202, 'title-202')
|
||||
ON DUPLICATE KEY UPDATE
|
||||
`time` = CASE `id`
|
||||
WHEN 200 THEN '2000-01-01 00:00:00.000'
|
||||
WHEN 201 THEN '2000-01-01 00:00:00.000'
|
||||
WHEN 202 THEN '2000-01-01 00:00:00.000' END");
|
||||
WHEN 202 THEN '2000-01-01 00:00:00.000' END", odku2.ToSql());
|
||||
odku2.ExecuteAffrows();
|
||||
}
|
||||
|
||||
@ -91,10 +91,10 @@ WHEN 202 THEN '2000-01-01 00:00:00.000' END");
|
||||
{
|
||||
g.mysql.Delete<TestOnDuplicateKeyUpdateInfo>(new[] { 300, 301, 302 }).ExecuteAffrows();
|
||||
var odku1 = g.mysql.Insert(new TestOnDuplicateKeyUpdateInfo { id = 300, title = "title-300", time = DateTime.Parse("2000-01-01") }).InsertColumns(a => a.title).NoneParameter().OnDuplicateKeyUpdate();
|
||||
Assert.Equal(odku1.ToSql(), @"INSERT INTO `TestOnDuplicateKeyUpdateInfo`(`id`, `title`) VALUES(300, 'title-300')
|
||||
Assert.Equal(@"INSERT INTO `TestOnDuplicateKeyUpdateInfo`(`id`, `title`) VALUES(300, 'title-300')
|
||||
ON DUPLICATE KEY UPDATE
|
||||
`title` = VALUES(`title`),
|
||||
`time` = '2000-01-01 00:00:00.000'");
|
||||
`time` = '2000-01-01 00:00:00.000'", odku1.ToSql());
|
||||
Assert.Equal(1, odku1.ExecuteAffrows());
|
||||
|
||||
var odku2 = g.mysql.Insert(new[] {
|
||||
@ -102,21 +102,21 @@ ON DUPLICATE KEY UPDATE
|
||||
new TestOnDuplicateKeyUpdateInfo { id = 301, title = "title-301", time = DateTime.Parse("2000-01-01") },
|
||||
new TestOnDuplicateKeyUpdateInfo { id = 302, title = "title-302", time = DateTime.Parse("2000-01-01") }
|
||||
}).InsertColumns(a => a.title).NoneParameter().OnDuplicateKeyUpdate();
|
||||
Assert.Equal(odku2.ToSql(), @"INSERT INTO `TestOnDuplicateKeyUpdateInfo`(`id`, `title`) VALUES(300, 'title-300'), (301, 'title-301'), (302, 'title-302')
|
||||
Assert.Equal(@"INSERT INTO `TestOnDuplicateKeyUpdateInfo`(`id`, `title`) VALUES(300, 'title-300'), (301, 'title-301'), (302, 'title-302')
|
||||
ON DUPLICATE KEY UPDATE
|
||||
`title` = VALUES(`title`),
|
||||
`time` = CASE `id`
|
||||
WHEN 300 THEN '2000-01-01 00:00:00.000'
|
||||
WHEN 301 THEN '2000-01-01 00:00:00.000'
|
||||
WHEN 302 THEN '2000-01-01 00:00:00.000' END");
|
||||
WHEN 302 THEN '2000-01-01 00:00:00.000' END", odku2.ToSql());
|
||||
odku2.ExecuteAffrows();
|
||||
|
||||
|
||||
g.mysql.Delete<TestOnDuplicateKeyUpdateInfo>(new[] { 300, 301, 302 }).ExecuteAffrows();
|
||||
odku1 = g.mysql.Insert(new TestOnDuplicateKeyUpdateInfo { id = 300, title = "title-300", time = DateTime.Parse("2000-01-01") }).InsertColumns(a => a.title).NoneParameter().OnDuplicateKeyUpdate().UpdateColumns(a => a.time);
|
||||
Assert.Equal(odku1.ToSql(), @"INSERT INTO `TestOnDuplicateKeyUpdateInfo`(`id`, `title`) VALUES(300, 'title-300')
|
||||
Assert.Equal(@"INSERT INTO `TestOnDuplicateKeyUpdateInfo`(`id`, `title`) VALUES(300, 'title-300')
|
||||
ON DUPLICATE KEY UPDATE
|
||||
`time` = '2000-01-01 00:00:00.000'");
|
||||
`time` = '2000-01-01 00:00:00.000'", odku1.ToSql());
|
||||
Assert.Equal(1, odku1.ExecuteAffrows());
|
||||
|
||||
odku2 = g.mysql.Insert(new[] {
|
||||
@ -124,12 +124,12 @@ ON DUPLICATE KEY UPDATE
|
||||
new TestOnDuplicateKeyUpdateInfo { id = 301, title = "title-301", time = DateTime.Parse("2000-01-01") },
|
||||
new TestOnDuplicateKeyUpdateInfo { id = 302, title = "title-302", time = DateTime.Parse("2000-01-01") }
|
||||
}).InsertColumns(a => a.title).NoneParameter().OnDuplicateKeyUpdate().UpdateColumns(a => a.time);
|
||||
Assert.Equal(odku2.ToSql(), @"INSERT INTO `TestOnDuplicateKeyUpdateInfo`(`id`, `title`) VALUES(300, 'title-300'), (301, 'title-301'), (302, 'title-302')
|
||||
Assert.Equal(@"INSERT INTO `TestOnDuplicateKeyUpdateInfo`(`id`, `title`) VALUES(300, 'title-300'), (301, 'title-301'), (302, 'title-302')
|
||||
ON DUPLICATE KEY UPDATE
|
||||
`time` = CASE `id`
|
||||
WHEN 300 THEN '2000-01-01 00:00:00.000'
|
||||
WHEN 301 THEN '2000-01-01 00:00:00.000'
|
||||
WHEN 302 THEN '2000-01-01 00:00:00.000' END");
|
||||
WHEN 302 THEN '2000-01-01 00:00:00.000' END", odku2.ToSql());
|
||||
odku2.ExecuteAffrows();
|
||||
}
|
||||
|
||||
@ -138,9 +138,9 @@ WHEN 302 THEN '2000-01-01 00:00:00.000' END");
|
||||
{
|
||||
g.mysql.Delete<TestOnDuplicateKeyUpdateInfo>(new[] { 400, 401, 402 }).ExecuteAffrows();
|
||||
var odku1 = g.mysql.Insert(new TestOnDuplicateKeyUpdateInfo { id = 400, title = "title-400", time = DateTime.Parse("2000-01-01") }).NoneParameter().OnDuplicateKeyUpdate().Set(a => a.time, DateTime.Parse("2020-1-1"));
|
||||
Assert.Equal(odku1.ToSql(), @"INSERT INTO `TestOnDuplicateKeyUpdateInfo`(`id`, `title`, `time`) VALUES(400, 'title-400', '2000-01-01 00:00:00.000')
|
||||
Assert.Equal(@"INSERT INTO `TestOnDuplicateKeyUpdateInfo`(`id`, `title`, `time`) VALUES(400, 'title-400', '2000-01-01 00:00:00.000')
|
||||
ON DUPLICATE KEY UPDATE
|
||||
`time` = '2020-01-01 00:00:00.000'");
|
||||
`time` = '2020-01-01 00:00:00.000'", odku1.ToSql());
|
||||
Assert.Equal(1, odku1.ExecuteAffrows());
|
||||
|
||||
var odku2 = g.mysql.Insert(new[] {
|
||||
@ -148,18 +148,18 @@ ON DUPLICATE KEY UPDATE
|
||||
new TestOnDuplicateKeyUpdateInfo { id = 401, title = "title-401", time = DateTime.Parse("2000-01-01") },
|
||||
new TestOnDuplicateKeyUpdateInfo { id = 402, title = "title-402", time = DateTime.Parse("2000-01-01") }
|
||||
}).NoneParameter().OnDuplicateKeyUpdate().Set(a => a.time, DateTime.Parse("2020-1-1"));
|
||||
Assert.Equal(odku2.ToSql(), @"INSERT INTO `TestOnDuplicateKeyUpdateInfo`(`id`, `title`, `time`) VALUES(400, 'title-400', '2000-01-01 00:00:00.000'), (401, 'title-401', '2000-01-01 00:00:00.000'), (402, 'title-402', '2000-01-01 00:00:00.000')
|
||||
Assert.Equal(@"INSERT INTO `TestOnDuplicateKeyUpdateInfo`(`id`, `title`, `time`) VALUES(400, 'title-400', '2000-01-01 00:00:00.000'), (401, 'title-401', '2000-01-01 00:00:00.000'), (402, 'title-402', '2000-01-01 00:00:00.000')
|
||||
ON DUPLICATE KEY UPDATE
|
||||
`time` = '2020-01-01 00:00:00.000'");
|
||||
`time` = '2020-01-01 00:00:00.000'", odku2.ToSql());
|
||||
odku2.ExecuteAffrows();
|
||||
|
||||
|
||||
var dt2020 = DateTime.Parse("2020-1-1");
|
||||
g.mysql.Delete<TestOnDuplicateKeyUpdateInfo>(new[] { 400, 401, 402 }).ExecuteAffrows();
|
||||
odku1 = g.mysql.Insert(new TestOnDuplicateKeyUpdateInfo { id = 400, title = "title-400", time = DateTime.Parse("2000-01-01") }).NoneParameter().OnDuplicateKeyUpdate().Set(a => a.time == dt2020);
|
||||
Assert.Equal(odku1.ToSql(), @"INSERT INTO `TestOnDuplicateKeyUpdateInfo`(`id`, `title`, `time`) VALUES(400, 'title-400', '2000-01-01 00:00:00.000')
|
||||
Assert.Equal(@"INSERT INTO `TestOnDuplicateKeyUpdateInfo`(`id`, `title`, `time`) VALUES(400, 'title-400', '2000-01-01 00:00:00.000')
|
||||
ON DUPLICATE KEY UPDATE
|
||||
`time` = '2020-01-01 00:00:00.000'");
|
||||
`time` = '2020-01-01 00:00:00.000'", odku1.ToSql());
|
||||
Assert.Equal(1, odku1.ExecuteAffrows());
|
||||
|
||||
odku2 = g.mysql.Insert(new[] {
|
||||
@ -167,17 +167,17 @@ ON DUPLICATE KEY UPDATE
|
||||
new TestOnDuplicateKeyUpdateInfo { id = 401, title = "title-401", time = DateTime.Parse("2000-01-01") },
|
||||
new TestOnDuplicateKeyUpdateInfo { id = 402, title = "title-402", time = DateTime.Parse("2000-01-01") }
|
||||
}).NoneParameter().OnDuplicateKeyUpdate().Set(a => a.time == dt2020);
|
||||
Assert.Equal(odku2.ToSql(), @"INSERT INTO `TestOnDuplicateKeyUpdateInfo`(`id`, `title`, `time`) VALUES(400, 'title-400', '2000-01-01 00:00:00.000'), (401, 'title-401', '2000-01-01 00:00:00.000'), (402, 'title-402', '2000-01-01 00:00:00.000')
|
||||
Assert.Equal(@"INSERT INTO `TestOnDuplicateKeyUpdateInfo`(`id`, `title`, `time`) VALUES(400, 'title-400', '2000-01-01 00:00:00.000'), (401, 'title-401', '2000-01-01 00:00:00.000'), (402, 'title-402', '2000-01-01 00:00:00.000')
|
||||
ON DUPLICATE KEY UPDATE
|
||||
`time` = '2020-01-01 00:00:00.000'");
|
||||
`time` = '2020-01-01 00:00:00.000'", odku2.ToSql());
|
||||
odku2.ExecuteAffrows();
|
||||
|
||||
|
||||
g.mysql.Delete<TestOnDuplicateKeyUpdateInfo>(new[] { 400, 401, 402 }).ExecuteAffrows();
|
||||
odku1 = g.mysql.Insert(new TestOnDuplicateKeyUpdateInfo { id = 400, title = "title-400", time = DateTime.Parse("2000-01-01") }).NoneParameter().OnDuplicateKeyUpdate().Set(a => new { time = dt2020, title = a.title + "123" });
|
||||
Assert.Equal(odku1.ToSql(), @"INSERT INTO `TestOnDuplicateKeyUpdateInfo`(`id`, `title`, `time`) VALUES(400, 'title-400', '2000-01-01 00:00:00.000')
|
||||
Assert.Equal(@"INSERT INTO `TestOnDuplicateKeyUpdateInfo`(`id`, `title`, `time`) VALUES(400, 'title-400', '2000-01-01 00:00:00.000')
|
||||
ON DUPLICATE KEY UPDATE
|
||||
`time` = '2020-01-01 00:00:00.000', `title` = concat(`title`, '123')");
|
||||
`time` = '2020-01-01 00:00:00.000', `title` = concat(`title`, '123')", odku1.ToSql());
|
||||
Assert.Equal(1, odku1.ExecuteAffrows());
|
||||
|
||||
odku2 = g.mysql.Insert(new[] {
|
||||
@ -185,9 +185,9 @@ ON DUPLICATE KEY UPDATE
|
||||
new TestOnDuplicateKeyUpdateInfo { id = 401, title = "title-401", time = DateTime.Parse("2000-01-01") },
|
||||
new TestOnDuplicateKeyUpdateInfo { id = 402, title = "title-402", time = DateTime.Parse("2000-01-01") }
|
||||
}).NoneParameter().OnDuplicateKeyUpdate().Set(a => new { time = dt2020, title = a.title + "123" });
|
||||
Assert.Equal(odku2.ToSql(), @"INSERT INTO `TestOnDuplicateKeyUpdateInfo`(`id`, `title`, `time`) VALUES(400, 'title-400', '2000-01-01 00:00:00.000'), (401, 'title-401', '2000-01-01 00:00:00.000'), (402, 'title-402', '2000-01-01 00:00:00.000')
|
||||
Assert.Equal(@"INSERT INTO `TestOnDuplicateKeyUpdateInfo`(`id`, `title`, `time`) VALUES(400, 'title-400', '2000-01-01 00:00:00.000'), (401, 'title-401', '2000-01-01 00:00:00.000'), (402, 'title-402', '2000-01-01 00:00:00.000')
|
||||
ON DUPLICATE KEY UPDATE
|
||||
`time` = '2020-01-01 00:00:00.000', `title` = concat(`title`, '123')");
|
||||
`time` = '2020-01-01 00:00:00.000', `title` = concat(`title`, '123')", odku2.ToSql());
|
||||
odku2.ExecuteAffrows();
|
||||
}
|
||||
|
||||
|
@ -1250,7 +1250,7 @@
|
||||
<param name="includeNestedMembers">false: 返回 2级 LeftJoin/InnerJoin/RightJoin 对象;true: 返回所有 LeftJoin/InnerJoin/RightJoin 的导航数据</param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:FreeSql.ISelect0`2.ToChunk(System.Int32,System.Action{System.Collections.Generic.List{`1}},System.Boolean)">
|
||||
<member name="M:FreeSql.ISelect0`2.ToChunk(System.Int32,System.Action{FreeSql.Internal.Model.FetchCallbackArgs{System.Collections.Generic.List{`1}}},System.Boolean)">
|
||||
<summary>
|
||||
执行SQL查询,分块返回数据,可减少内存开销。比如读取10万条数据,每次返回100条处理。
|
||||
</summary>
|
||||
@ -2401,16 +2401,16 @@
|
||||
当前线程的事务
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:FreeSql.IAdo.ExecuteReader(System.Action{System.Data.Common.DbDataReader},System.Data.CommandType,System.String,System.Data.Common.DbParameter[])">
|
||||
<member name="M:FreeSql.IAdo.ExecuteReader(System.Action{FreeSql.Internal.Model.FetchCallbackArgs{System.Data.Common.DbDataReader}},System.Data.CommandType,System.String,System.Data.Common.DbParameter[])">
|
||||
<summary>
|
||||
查询,若使用读写分离,查询【从库】条件cmdText.StartsWith("SELECT "),否则查询【主库】
|
||||
</summary>
|
||||
<param name="readerHander"></param>
|
||||
<param name="fetchHandler"></param>
|
||||
<param name="cmdType"></param>
|
||||
<param name="cmdText"></param>
|
||||
<param name="cmdParms"></param>
|
||||
</member>
|
||||
<member name="M:FreeSql.IAdo.ExecuteReader(System.Action{System.Data.Common.DbDataReader},System.String,System.Object)">
|
||||
<member name="M:FreeSql.IAdo.ExecuteReader(System.Action{FreeSql.Internal.Model.FetchCallbackArgs{System.Data.Common.DbDataReader}},System.String,System.Object)">
|
||||
<summary>
|
||||
查询,ExecuteReader(dr => {}, "select * from user where age > ?age", new { age = 25 })
|
||||
</summary>
|
||||
@ -2532,7 +2532,7 @@
|
||||
<param name="parms"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:FreeSql.IAdo.ExecuteReaderAsync(System.Func{System.Data.Common.DbDataReader,System.Threading.Tasks.Task},System.Data.CommandType,System.String,System.Data.Common.DbParameter[])">
|
||||
<member name="M:FreeSql.IAdo.ExecuteReaderAsync(System.Func{FreeSql.Internal.Model.FetchCallbackArgs{System.Data.Common.DbDataReader},System.Threading.Tasks.Task},System.Data.CommandType,System.String,System.Data.Common.DbParameter[])">
|
||||
<summary>
|
||||
查询,若使用读写分离,查询【从库】条件cmdText.StartsWith("SELECT "),否则查询【主库】
|
||||
</summary>
|
||||
@ -2541,7 +2541,7 @@
|
||||
<param name="cmdText"></param>
|
||||
<param name="cmdParms"></param>
|
||||
</member>
|
||||
<member name="M:FreeSql.IAdo.ExecuteReaderAsync(System.Func{System.Data.Common.DbDataReader,System.Threading.Tasks.Task},System.String,System.Object)">
|
||||
<member name="M:FreeSql.IAdo.ExecuteReaderAsync(System.Func{FreeSql.Internal.Model.FetchCallbackArgs{System.Data.Common.DbDataReader},System.Threading.Tasks.Task},System.String,System.Object)">
|
||||
<summary>
|
||||
查询,ExecuteReaderAsync(dr => {}, "select * from user where age > ?age", new { age = 25 })
|
||||
</summary>
|
||||
@ -2933,104 +2933,89 @@
|
||||
转大写同步结构,适用 Oracle/达梦/人大金仓
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Fre 获å<EFBFBD>–c#类型,intã€<EFBFBD>long
|
||||
</summary>
|
||||
<param name="column"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:FreeSql.IDbFirst.GetCsTypeInfo(FreeSql.DatabaseModel.DbColumnInfo)">
|
||||
<member name="P:FreeSql.ICodeFirst.IsConfigEntityFromDbFirst">
|
||||
<summary>
|
||||
获å<C2B7>–c#类型对象
|
||||
</summary>
|
||||
<param name="column"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:FreeSql.IDbFirst.GetDataReaderMethod(FreeSql.DatabaseModel.DbColumnInfo)">
|
||||
<summary>
|
||||
获å<C2B7>–ado.net读å<C2BB>–方法, GetBooleanã€<C3A3>GetInt64
|
||||
</summary>
|
||||
<param name="column"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:FreeSql.IDbFirst.GetCsStringify(FreeSql.DatabaseModel.DbColumnInfo)">
|
||||
<summary>
|
||||
åº<C3A5>列化
|
||||
</summary>
|
||||
<param name="column"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:FreeSql.IDbFirst.GetCsParse(FreeSql.DatabaseModel.DbColumnInfo)">
|
||||
<summary>
|
||||
å<><C3A5>åº<C3A5>列化
|
||||
</summary>
|
||||
<param name="column"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:FreeSql.IDbFirst.GetEnumsByDatabase(System.String[])">
|
||||
<summary>
|
||||
获å<C2B7>–æ•°æ<C2B0>®åº“枚举类型,适用 PostgreSQL
|
||||
</summary>
|
||||
<param name="database"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:FreeSql.Internal.CommonProvider.InsertOrUpdateProvider`1.SplitSourceByIdentityValueIsNull(System.Collections.Generic.List{`0})">
|
||||
<summary>
|
||||
如果实体类有自增属性,分æˆ<C3A6>两个 List,有值的Item1 mergeï¼Œæ— å€¼çš„Item2 insert
|
||||
</summary>
|
||||
<param name="source"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:FreeSql.Internal.CommonProvider.InsertProvider`1.IgnoreCanInsert">
|
||||
<summary>
|
||||
AsType, Ctor, ClearData 三处地方需è¦<C3A8>é‡<C3A9>æ–°åŠ è½½
|
||||
将数据库的主键、自增、索引设置导入,适用 DbFirst 模式,无须在实体类型上设置 [Column(IsPrimary)] 或者 ConfigEntity。此功能目前可用于 mysql/sqlserver/postgresql/oracle。<para></para>
|
||||
本功能会影响 IFreeSql 首次访问的速度。<para></para>
|
||||
若使用 CodeFirst 创建索引后,又直接在数据库上建了索引,若无本功能下一次 CodeFirst 迁移时数据库上创建的索引将被删除
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:FreeSql.Internal.CommonProvider.UpdateProvider`1.IgnoreCanUpdate">
|
||||
<member name="P:FreeSql.ICodeFirst.IsNoneCommandParameter">
|
||||
<summary>
|
||||
AsType, Ctor, ClearData 三处地方需è¦<C3A8>é‡<C3A9>æ–°åŠ è½½
|
||||
不使用命令参数化执行,针对 Insert/Update
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:FreeSql.Internal.CommonUtils.GetPropertyCommentByDescriptionAttribute(System.Type)">
|
||||
<member name="P:FreeSql.ICodeFirst.IsGenerateCommandParameterWithLambda">
|
||||
<summary>
|
||||
动æ€<C3A6>读å<C2BB>– DescriptionAttribute 注释文本
|
||||
是否生成命令参数化执行,针对 lambda 表达式解析<para></para>
|
||||
注意:常量不会参数化,变量才会做参数化<para></para>
|
||||
var id = 100;
|
||||
fsql.Select<T>().Where(a => a.id == id) 会参数化<para></para>
|
||||
fsql.Select<T>().Where(a => a.id == 100) 不会参数化
|
||||
</summary>
|
||||
<param name="type"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:FreeSql.Internal.CommonUtils.GetProperyCommentBySummary(System.Type)">
|
||||
<member name="P:FreeSql.ICodeFirst.IsLazyLoading">
|
||||
<summary>
|
||||
通过属性的注释文本,通过 xml 读å<C2BB>–
|
||||
延时加载导航属性对象,导航属性需要声明 virtual
|
||||
</summary>
|
||||
<param name="type"></param>
|
||||
<returns>Dict:key=属性å<C2A7><C3A5>,value=注释</returns>
|
||||
</member>
|
||||
<member name="M:FreeSql.Internal.GlobalFilter.Apply``1(System.String,System.Linq.Expressions.Expression{System.Func{``0,System.Boolean}})">
|
||||
<member name="M:FreeSql.ICodeFirst.GetComparisonDDLStatements``1">
|
||||
<summary>
|
||||
创建一个过滤器
|
||||
将实体类型与数据库对比,返回DDL语句
|
||||
</summary>
|
||||
<typeparam name="TEntity"></typeparam>
|
||||
<param name="name">å<EFBFBD><EFBFBD>å—</param>
|
||||
<param name="where">表达å¼<EFBFBD></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="P:FreeSql.Internal.Model.BatchProgressStatus`1.Data">
|
||||
<member name="M:FreeSql.ICodeFirst.GetComparisonDDLStatements(System.Type[])">
|
||||
<summary>
|
||||
当å‰<EFBFBD>æ“<EFBFBD>作的数æ<EFBFBD>®
|
||||
将实体类型集合与数据库对比,返回DDL语句
|
||||
</summary>
|
||||
<param name="entityTypes">实体类型</param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="P:FreeSql.Internal.Model.BatchProgressStatus`1.Current">
|
||||
<member name="M:FreeSql.ICodeFirst.GetComparisonDDLStatements(System.Type,System.String)">
|
||||
<summary>
|
||||
当å‰<EFBFBD>批次
|
||||
将实体类型与数据库对比,返回DDL语句(指定表名)
|
||||
</summary>
|
||||
<param name="entityType">实体类型</param>
|
||||
<param name="tableName">指定表名对比</param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="P:FreeSql.Internal.Model.BatchProgressStatus`1.Total">
|
||||
<member name="M:FreeSql.ICodeFirst.SyncStructure``1">
|
||||
<summary>
|
||||
总批次数é‡<C3A9>
|
||||
同步实体类型到数据库<para></para>
|
||||
注意:生产环境中谨慎使用
|
||||
</summary>
|
||||
<typeparam name="TEntity"></typeparam>
|
||||
</member>
|
||||
<member name="T:FreeSql.Internal.Model.DynamicFilterInfo">
|
||||
<member name="M:FreeSql.ICodeFirst.SyncStructure(System.Type[])">
|
||||
<summary>
|
||||
åŠme="entity"></param>
|
||||
同步实体类型集合到数据库<para></para>
|
||||
注意:生产环境中谨慎使用
|
||||
</summary>
|
||||
<param name="entityTypes"></param>
|
||||
</member>
|
||||
<member name="M:FreeSql.ICodeFirst.SyncStructure(System.Type,System.String)">
|
||||
<summary>
|
||||
同步实体类型到数据库(指定表名)<para></para>
|
||||
注意:生产环境中谨慎使用
|
||||
</summary>
|
||||
<param name="entityType">实体类型</param>
|
||||
<param name="tableName">指定表名对比</param>
|
||||
</member>
|
||||
<member name="M:FreeSql.ICodeFirst.GetDbInfo(System.Type)">
|
||||
<summary>
|
||||
根据 System.Type 获取数据库信息
|
||||
</summary>
|
||||
<param name="type"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:FreeSql.ICodeFirst.ConfigEntity``1(System.Action{FreeSql.DataAnnotations.TableFluent{``0}})">
|
||||
<summary>
|
||||
FreeSql FluentApi 配置实体,方法名与特性相同
|
||||
</summary>
|
||||
<typeparam name="T"></typeparam>
|
||||
<param name="entity"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:FreeSql.ICodeFirst.ConfigEntity(System.Type,System.Action{FreeSql.DataAnnotations.TableFluent})">
|
||||
@ -3298,6 +3283,11 @@
|
||||
此时 Value 的值格式为逗号分割:value1,value2,value3... 或者数组
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:FreeSql.Internal.Model.FetchCallbackArgs`1.IsBreak">
|
||||
<summary>
|
||||
是否放弃继续读取
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:FreeSql.Internal.Model.TableRef.RefMiddleEntityType">
|
||||
<summary>
|
||||
中间表,多对多
|
||||
|
@ -79,7 +79,7 @@ namespace FreeSql
|
||||
/// <param name="size">数据块的大小</param>
|
||||
/// <param name="done">处理数据块</param>
|
||||
/// <param name="includeNestedMembers">false: 返回 2级 LeftJoin/InnerJoin/RightJoin 对象;true: 返回所有 LeftJoin/InnerJoin/RightJoin 的导航数据</param>
|
||||
void ToChunk(int size, Action<List<T1>> done, bool includeNestedMembers = false);
|
||||
void ToChunk(int size, Action<FetchCallbackArgs<List<T1>>> done, bool includeNestedMembers = false);
|
||||
/// <summary>
|
||||
/// 执行SQL查询,返回 field 指定字段的记录,并以元组或基础类型(int,string,long)接收,记录不存在时返回 Count 为 0 的列表
|
||||
/// </summary>
|
||||
|
@ -58,21 +58,21 @@ namespace FreeSql
|
||||
/// <summary>
|
||||
/// 查询,若使用读写分离,查询【从库】条件cmdText.StartsWith("SELECT "),否则查询【主库】
|
||||
/// </summary>
|
||||
/// <param name="readerHander"></param>
|
||||
/// <param name="fetchHandler"></param>
|
||||
/// <param name="cmdType"></param>
|
||||
/// <param name="cmdText"></param>
|
||||
/// <param name="cmdParms"></param>
|
||||
void ExecuteReader(Action<DbDataReader> readerHander, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
|
||||
void ExecuteReader(DbTransaction transaction, Action<DbDataReader> readerHander, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
|
||||
void ExecuteReader(DbConnection connection, DbTransaction transaction, Action<DbDataReader> readerHander, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
|
||||
void ExecuteReader(Action<FetchCallbackArgs<DbDataReader>> fetchHandler, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
|
||||
void ExecuteReader(DbTransaction transaction, Action<FetchCallbackArgs<DbDataReader>> fetchHandler, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
|
||||
void ExecuteReader(DbConnection connection, DbTransaction transaction, Action<FetchCallbackArgs<DbDataReader>> fetchHandler, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
|
||||
/// <summary>
|
||||
/// 查询,ExecuteReader(dr => {}, "select * from user where age > ?age", new { age = 25 })
|
||||
/// </summary>
|
||||
/// <param name="cmdText"></param>
|
||||
/// <param name="parms"></param>
|
||||
void ExecuteReader(Action<DbDataReader> readerHander, string cmdText, object parms = null);
|
||||
void ExecuteReader(DbTransaction transaction, Action<DbDataReader> readerHander, string cmdText, object parms = null);
|
||||
void ExecuteReader(DbConnection connection, DbTransaction transaction, Action<DbDataReader> readerHander, string cmdText, object parms = null);
|
||||
void ExecuteReader(Action<FetchCallbackArgs<DbDataReader>> fetchHandler, string cmdText, object parms = null);
|
||||
void ExecuteReader(DbTransaction transaction, Action<FetchCallbackArgs<DbDataReader>> fetchHandler, string cmdText, object parms = null);
|
||||
void ExecuteReader(DbConnection connection, DbTransaction transaction, Action<FetchCallbackArgs<DbDataReader>> fetchHandler, string cmdText, object parms = null);
|
||||
/// <summary>
|
||||
/// 查询
|
||||
/// </summary>
|
||||
@ -235,17 +235,17 @@ namespace FreeSql
|
||||
/// <param name="cmdType"></param>
|
||||
/// <param name="cmdText"></param>
|
||||
/// <param name="cmdParms"></param>
|
||||
Task ExecuteReaderAsync(Func<DbDataReader, Task> readerHander, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
|
||||
Task ExecuteReaderAsync(DbTransaction transaction, Func<DbDataReader, Task> readerHander, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
|
||||
Task ExecuteReaderAsync(DbConnection connection, DbTransaction transaction, Func<DbDataReader, Task> readerHander, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
|
||||
Task ExecuteReaderAsync(Func<FetchCallbackArgs<DbDataReader>, Task> readerHander, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
|
||||
Task ExecuteReaderAsync(DbTransaction transaction, Func<FetchCallbackArgs<DbDataReader>, Task> readerHander, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
|
||||
Task ExecuteReaderAsync(DbConnection connection, DbTransaction transaction, Func<FetchCallbackArgs<DbDataReader>, Task> readerHander, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
|
||||
/// <summary>
|
||||
/// 查询,ExecuteReaderAsync(dr => {}, "select * from user where age > ?age", new { age = 25 })
|
||||
/// </summary>
|
||||
/// <param name="cmdText"></param>
|
||||
/// <param name="parms"></param>
|
||||
Task ExecuteReaderAsync(Func<DbDataReader, Task> readerHander, string cmdText, object parms = null);
|
||||
Task ExecuteReaderAsync(DbTransaction transaction, Func<DbDataReader, Task> readerHander, string cmdText, object parms = null);
|
||||
Task ExecuteReaderAsync(DbConnection connection, DbTransaction transaction, Func<DbDataReader, Task> readerHander, string cmdText, object parms = null);
|
||||
Task ExecuteReaderAsync(Func<FetchCallbackArgs<DbDataReader>, Task> readerHander, string cmdText, object parms = null);
|
||||
Task ExecuteReaderAsync(DbTransaction transaction, Func<FetchCallbackArgs<DbDataReader>, Task> readerHander, string cmdText, object parms = null);
|
||||
Task ExecuteReaderAsync(DbConnection connection, DbTransaction transaction, Func<FetchCallbackArgs<DbDataReader>, Task> readerHander, string cmdText, object parms = null);
|
||||
/// <summary>
|
||||
/// 查询
|
||||
/// </summary>
|
||||
|
@ -109,15 +109,15 @@ namespace FreeSql.Internal.CommonProvider
|
||||
string flag = null;
|
||||
int[] indexes = null;
|
||||
var props = GetQueryTypeProperties(type);
|
||||
ExecuteReader(connection, transaction, dr =>
|
||||
ExecuteReader(connection, transaction, fetch =>
|
||||
{
|
||||
if (indexes == null)
|
||||
{
|
||||
var sbflag = new StringBuilder().Append("adoQuery");
|
||||
var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
|
||||
for (var a = 0; a < dr.FieldCount; a++)
|
||||
for (var a = 0; a < fetch.Object.FieldCount; a++)
|
||||
{
|
||||
var name = dr.GetName(a);
|
||||
var name = fetch.Object.GetName(a);
|
||||
if (dic.ContainsKey(name)) continue;
|
||||
sbflag.Append(name).Append(":").Append(a).Append(",");
|
||||
dic.Add(name, a);
|
||||
@ -125,7 +125,7 @@ namespace FreeSql.Internal.CommonProvider
|
||||
indexes = props.Select(a => dic.TryGetValue(a.Key, out var tryint) ? tryint : -1).ToArray();
|
||||
flag = sbflag.ToString();
|
||||
}
|
||||
ret.Add((T)Utils.ExecuteArrayRowReadClassOrTuple(flag, type, indexes, dr, 0, _util).Value);
|
||||
ret.Add((T)Utils.ExecuteArrayRowReadClassOrTuple(flag, type, indexes, fetch.Object, 0, _util).Value);
|
||||
}, cmdType, cmdText, cmdParms);
|
||||
return ret;
|
||||
}
|
||||
@ -149,7 +149,7 @@ namespace FreeSql.Internal.CommonProvider
|
||||
string flag2 = null;
|
||||
int[] indexes2 = null;
|
||||
var props2 = GetQueryTypeProperties(type2);
|
||||
ExecuteReaderMultiple(2, connection, transaction, (dr, result) =>
|
||||
ExecuteReaderMultiple(2, connection, transaction, (fetch, result) =>
|
||||
{
|
||||
switch (result)
|
||||
{
|
||||
@ -158,9 +158,9 @@ namespace FreeSql.Internal.CommonProvider
|
||||
{
|
||||
var sbflag = new StringBuilder().Append("adoQuery");
|
||||
var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
|
||||
for (var a = 0; a < dr.FieldCount; a++)
|
||||
for (var a = 0; a < fetch.Object.FieldCount; a++)
|
||||
{
|
||||
var name = dr.GetName(a);
|
||||
var name = fetch.Object.GetName(a);
|
||||
if (dic.ContainsKey(name)) continue;
|
||||
sbflag.Append(name).Append(":").Append(a).Append(",");
|
||||
dic.Add(name, a);
|
||||
@ -168,16 +168,16 @@ namespace FreeSql.Internal.CommonProvider
|
||||
indexes1 = props1.Select(a => dic.TryGetValue(a.Key, out var tryint) ? tryint : -1).ToArray();
|
||||
flag1 = sbflag.ToString();
|
||||
}
|
||||
ret1.Add((T1)Utils.ExecuteArrayRowReadClassOrTuple(flag1, type1, indexes1, dr, 0, _util).Value);
|
||||
ret1.Add((T1)Utils.ExecuteArrayRowReadClassOrTuple(flag1, type1, indexes1, fetch.Object, 0, _util).Value);
|
||||
break;
|
||||
case 1:
|
||||
if (indexes2 == null)
|
||||
{
|
||||
var sbflag = new StringBuilder().Append("adoQuery");
|
||||
var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
|
||||
for (var a = 0; a < dr.FieldCount; a++)
|
||||
for (var a = 0; a < fetch.Object.FieldCount; a++)
|
||||
{
|
||||
var name = dr.GetName(a);
|
||||
var name = fetch.Object.GetName(a);
|
||||
if (dic.ContainsKey(name)) continue;
|
||||
sbflag.Append(name).Append(":").Append(a).Append(",");
|
||||
dic.Add(name, a);
|
||||
@ -185,7 +185,7 @@ namespace FreeSql.Internal.CommonProvider
|
||||
indexes2 = props2.Select(a => dic.TryGetValue(a.Key, out var tryint) ? tryint : -1).ToArray();
|
||||
flag2 = sbflag.ToString();
|
||||
}
|
||||
ret2.Add((T2)Utils.ExecuteArrayRowReadClassOrTuple(flag2, type2, indexes2, dr, 0, _util).Value);
|
||||
ret2.Add((T2)Utils.ExecuteArrayRowReadClassOrTuple(flag2, type2, indexes2, fetch.Object, 0, _util).Value);
|
||||
break;
|
||||
}
|
||||
}, cmdType, cmdText, cmdParms);
|
||||
@ -217,7 +217,7 @@ namespace FreeSql.Internal.CommonProvider
|
||||
string flag3 = null;
|
||||
int[] indexes3 = null;
|
||||
var props3 = GetQueryTypeProperties(type3);
|
||||
ExecuteReaderMultiple(3, connection, transaction, (dr, result) =>
|
||||
ExecuteReaderMultiple(3, connection, transaction, (fetch, result) =>
|
||||
{
|
||||
switch (result)
|
||||
{
|
||||
@ -226,9 +226,9 @@ namespace FreeSql.Internal.CommonProvider
|
||||
{
|
||||
var sbflag = new StringBuilder().Append("adoQuery");
|
||||
var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
|
||||
for (var a = 0; a < dr.FieldCount; a++)
|
||||
for (var a = 0; a < fetch.Object.FieldCount; a++)
|
||||
{
|
||||
var name = dr.GetName(a);
|
||||
var name = fetch.Object.GetName(a);
|
||||
if (dic.ContainsKey(name)) continue;
|
||||
sbflag.Append(name).Append(":").Append(a).Append(",");
|
||||
dic.Add(name, a);
|
||||
@ -236,16 +236,16 @@ namespace FreeSql.Internal.CommonProvider
|
||||
indexes1 = props1.Select(a => dic.TryGetValue(a.Key, out var tryint) ? tryint : -1).ToArray();
|
||||
flag1 = sbflag.ToString();
|
||||
}
|
||||
ret1.Add((T1)Utils.ExecuteArrayRowReadClassOrTuple(flag1, type1, indexes1, dr, 0, _util).Value);
|
||||
ret1.Add((T1)Utils.ExecuteArrayRowReadClassOrTuple(flag1, type1, indexes1, fetch.Object, 0, _util).Value);
|
||||
break;
|
||||
case 1:
|
||||
if (indexes2 == null)
|
||||
{
|
||||
var sbflag = new StringBuilder().Append("adoQuery");
|
||||
var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
|
||||
for (var a = 0; a < dr.FieldCount; a++)
|
||||
for (var a = 0; a < fetch.Object.FieldCount; a++)
|
||||
{
|
||||
var name = dr.GetName(a);
|
||||
var name = fetch.Object.GetName(a);
|
||||
if (dic.ContainsKey(name)) continue;
|
||||
sbflag.Append(name).Append(":").Append(a).Append(",");
|
||||
dic.Add(name, a);
|
||||
@ -253,16 +253,16 @@ namespace FreeSql.Internal.CommonProvider
|
||||
indexes2 = props2.Select(a => dic.TryGetValue(a.Key, out var tryint) ? tryint : -1).ToArray();
|
||||
flag2 = sbflag.ToString();
|
||||
}
|
||||
ret2.Add((T2)Utils.ExecuteArrayRowReadClassOrTuple(flag2, type2, indexes2, dr, 0, _util).Value);
|
||||
ret2.Add((T2)Utils.ExecuteArrayRowReadClassOrTuple(flag2, type2, indexes2, fetch.Object, 0, _util).Value);
|
||||
break;
|
||||
case 2:
|
||||
if (indexes3 == null)
|
||||
{
|
||||
var sbflag = new StringBuilder().Append("adoQuery");
|
||||
var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
|
||||
for (var a = 0; a < dr.FieldCount; a++)
|
||||
for (var a = 0; a < fetch.Object.FieldCount; a++)
|
||||
{
|
||||
var name = dr.GetName(a);
|
||||
var name = fetch.Object.GetName(a);
|
||||
if (dic.ContainsKey(name)) continue;
|
||||
sbflag.Append(name).Append(":").Append(a).Append(",");
|
||||
dic.Add(name, a);
|
||||
@ -270,7 +270,7 @@ namespace FreeSql.Internal.CommonProvider
|
||||
indexes3 = props3.Select(a => dic.TryGetValue(a.Key, out var tryint) ? tryint : -1).ToArray();
|
||||
flag3 = sbflag.ToString();
|
||||
}
|
||||
ret3.Add((T3)Utils.ExecuteArrayRowReadClassOrTuple(flag3, type3, indexes3, dr, 0, _util).Value);
|
||||
ret3.Add((T3)Utils.ExecuteArrayRowReadClassOrTuple(flag3, type3, indexes3, fetch.Object, 0, _util).Value);
|
||||
break;
|
||||
}
|
||||
}, cmdType, cmdText, cmdParms);
|
||||
@ -308,7 +308,7 @@ namespace FreeSql.Internal.CommonProvider
|
||||
string flag4 = null;
|
||||
int[] indexes4 = null;
|
||||
var props4 = GetQueryTypeProperties(type4);
|
||||
ExecuteReaderMultiple(4, connection, transaction, (dr, result) =>
|
||||
ExecuteReaderMultiple(4, connection, transaction, (fetch, result) =>
|
||||
{
|
||||
switch (result)
|
||||
{
|
||||
@ -317,9 +317,9 @@ namespace FreeSql.Internal.CommonProvider
|
||||
{
|
||||
var sbflag = new StringBuilder().Append("adoQuery");
|
||||
var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
|
||||
for (var a = 0; a < dr.FieldCount; a++)
|
||||
for (var a = 0; a < fetch.Object.FieldCount; a++)
|
||||
{
|
||||
var name = dr.GetName(a);
|
||||
var name = fetch.Object.GetName(a);
|
||||
if (dic.ContainsKey(name)) continue;
|
||||
sbflag.Append(name).Append(":").Append(a).Append(",");
|
||||
dic.Add(name, a);
|
||||
@ -327,16 +327,16 @@ namespace FreeSql.Internal.CommonProvider
|
||||
indexes1 = props1.Select(a => dic.TryGetValue(a.Key, out var tryint) ? tryint : -1).ToArray();
|
||||
flag1 = sbflag.ToString();
|
||||
}
|
||||
ret1.Add((T1)Utils.ExecuteArrayRowReadClassOrTuple(flag1, type1, indexes1, dr, 0, _util).Value);
|
||||
ret1.Add((T1)Utils.ExecuteArrayRowReadClassOrTuple(flag1, type1, indexes1, fetch.Object, 0, _util).Value);
|
||||
break;
|
||||
case 1:
|
||||
if (indexes2 == null)
|
||||
{
|
||||
var sbflag = new StringBuilder().Append("adoQuery");
|
||||
var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
|
||||
for (var a = 0; a < dr.FieldCount; a++)
|
||||
for (var a = 0; a < fetch.Object.FieldCount; a++)
|
||||
{
|
||||
var name = dr.GetName(a);
|
||||
var name = fetch.Object.GetName(a);
|
||||
if (dic.ContainsKey(name)) continue;
|
||||
sbflag.Append(name).Append(":").Append(a).Append(",");
|
||||
dic.Add(name, a);
|
||||
@ -344,16 +344,16 @@ namespace FreeSql.Internal.CommonProvider
|
||||
indexes2 = props2.Select(a => dic.TryGetValue(a.Key, out var tryint) ? tryint : -1).ToArray();
|
||||
flag2 = sbflag.ToString();
|
||||
}
|
||||
ret2.Add((T2)Utils.ExecuteArrayRowReadClassOrTuple(flag2, type2, indexes2, dr, 0, _util).Value);
|
||||
ret2.Add((T2)Utils.ExecuteArrayRowReadClassOrTuple(flag2, type2, indexes2, fetch.Object, 0, _util).Value);
|
||||
break;
|
||||
case 2:
|
||||
if (indexes3 == null)
|
||||
{
|
||||
var sbflag = new StringBuilder().Append("adoQuery");
|
||||
var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
|
||||
for (var a = 0; a < dr.FieldCount; a++)
|
||||
for (var a = 0; a < fetch.Object.FieldCount; a++)
|
||||
{
|
||||
var name = dr.GetName(a);
|
||||
var name = fetch.Object.GetName(a);
|
||||
if (dic.ContainsKey(name)) continue;
|
||||
sbflag.Append(name).Append(":").Append(a).Append(",");
|
||||
dic.Add(name, a);
|
||||
@ -361,16 +361,16 @@ namespace FreeSql.Internal.CommonProvider
|
||||
indexes3 = props3.Select(a => dic.TryGetValue(a.Key, out var tryint) ? tryint : -1).ToArray();
|
||||
flag3 = sbflag.ToString();
|
||||
}
|
||||
ret3.Add((T3)Utils.ExecuteArrayRowReadClassOrTuple(flag3, type3, indexes3, dr, 0, _util).Value);
|
||||
ret3.Add((T3)Utils.ExecuteArrayRowReadClassOrTuple(flag3, type3, indexes3, fetch.Object, 0, _util).Value);
|
||||
break;
|
||||
case 3:
|
||||
if (indexes4 == null)
|
||||
{
|
||||
var sbflag = new StringBuilder().Append("adoQuery");
|
||||
var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
|
||||
for (var a = 0; a < dr.FieldCount; a++)
|
||||
for (var a = 0; a < fetch.Object.FieldCount; a++)
|
||||
{
|
||||
var name = dr.GetName(a);
|
||||
var name = fetch.Object.GetName(a);
|
||||
if (dic.ContainsKey(name)) continue;
|
||||
sbflag.Append(name).Append(":").Append(a).Append(",");
|
||||
dic.Add(name, a);
|
||||
@ -378,7 +378,7 @@ namespace FreeSql.Internal.CommonProvider
|
||||
indexes4 = props4.Select(a => dic.TryGetValue(a.Key, out var tryint) ? tryint : -1).ToArray();
|
||||
flag4 = sbflag.ToString();
|
||||
}
|
||||
ret4.Add((T4)Utils.ExecuteArrayRowReadClassOrTuple(flag4, type4, indexes4, dr, 0, _util).Value);
|
||||
ret4.Add((T4)Utils.ExecuteArrayRowReadClassOrTuple(flag4, type4, indexes4, fetch.Object, 0, _util).Value);
|
||||
break;
|
||||
}
|
||||
}, cmdType, cmdText, cmdParms);
|
||||
@ -422,7 +422,7 @@ namespace FreeSql.Internal.CommonProvider
|
||||
string flag5 = null;
|
||||
int[] indexes5 = null;
|
||||
var props5 = GetQueryTypeProperties(type5);
|
||||
ExecuteReaderMultiple(5, connection, transaction, (dr, result) =>
|
||||
ExecuteReaderMultiple(5, connection, transaction, (fetch, result) =>
|
||||
{
|
||||
switch (result)
|
||||
{
|
||||
@ -431,9 +431,9 @@ namespace FreeSql.Internal.CommonProvider
|
||||
{
|
||||
var sbflag = new StringBuilder().Append("adoQuery");
|
||||
var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
|
||||
for (var a = 0; a < dr.FieldCount; a++)
|
||||
for (var a = 0; a < fetch.Object.FieldCount; a++)
|
||||
{
|
||||
var name = dr.GetName(a);
|
||||
var name = fetch.Object.GetName(a);
|
||||
if (dic.ContainsKey(name)) continue;
|
||||
sbflag.Append(name).Append(":").Append(a).Append(",");
|
||||
dic.Add(name, a);
|
||||
@ -441,16 +441,16 @@ namespace FreeSql.Internal.CommonProvider
|
||||
indexes1 = props1.Select(a => dic.TryGetValue(a.Key, out var tryint) ? tryint : -1).ToArray();
|
||||
flag1 = sbflag.ToString();
|
||||
}
|
||||
ret1.Add((T1)Utils.ExecuteArrayRowReadClassOrTuple(flag1, type1, indexes1, dr, 0, _util).Value);
|
||||
ret1.Add((T1)Utils.ExecuteArrayRowReadClassOrTuple(flag1, type1, indexes1, fetch.Object, 0, _util).Value);
|
||||
break;
|
||||
case 1:
|
||||
if (indexes2 == null)
|
||||
{
|
||||
var sbflag = new StringBuilder().Append("adoQuery");
|
||||
var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
|
||||
for (var a = 0; a < dr.FieldCount; a++)
|
||||
for (var a = 0; a < fetch.Object.FieldCount; a++)
|
||||
{
|
||||
var name = dr.GetName(a);
|
||||
var name = fetch.Object.GetName(a);
|
||||
if (dic.ContainsKey(name)) continue;
|
||||
sbflag.Append(name).Append(":").Append(a).Append(",");
|
||||
dic.Add(name, a);
|
||||
@ -458,16 +458,16 @@ namespace FreeSql.Internal.CommonProvider
|
||||
indexes2 = props2.Select(a => dic.TryGetValue(a.Key, out var tryint) ? tryint : -1).ToArray();
|
||||
flag2 = sbflag.ToString();
|
||||
}
|
||||
ret2.Add((T2)Utils.ExecuteArrayRowReadClassOrTuple(flag2, type2, indexes2, dr, 0, _util).Value);
|
||||
ret2.Add((T2)Utils.ExecuteArrayRowReadClassOrTuple(flag2, type2, indexes2, fetch.Object, 0, _util).Value);
|
||||
break;
|
||||
case 2:
|
||||
if (indexes3 == null)
|
||||
{
|
||||
var sbflag = new StringBuilder().Append("adoQuery");
|
||||
var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
|
||||
for (var a = 0; a < dr.FieldCount; a++)
|
||||
for (var a = 0; a < fetch.Object.FieldCount; a++)
|
||||
{
|
||||
var name = dr.GetName(a);
|
||||
var name = fetch.Object.GetName(a);
|
||||
if (dic.ContainsKey(name)) continue;
|
||||
sbflag.Append(name).Append(":").Append(a).Append(",");
|
||||
dic.Add(name, a);
|
||||
@ -475,16 +475,16 @@ namespace FreeSql.Internal.CommonProvider
|
||||
indexes3 = props3.Select(a => dic.TryGetValue(a.Key, out var tryint) ? tryint : -1).ToArray();
|
||||
flag3 = sbflag.ToString();
|
||||
}
|
||||
ret3.Add((T3)Utils.ExecuteArrayRowReadClassOrTuple(flag3, type3, indexes3, dr, 0, _util).Value);
|
||||
ret3.Add((T3)Utils.ExecuteArrayRowReadClassOrTuple(flag3, type3, indexes3, fetch.Object, 0, _util).Value);
|
||||
break;
|
||||
case 3:
|
||||
if (indexes4 == null)
|
||||
{
|
||||
var sbflag = new StringBuilder().Append("adoQuery");
|
||||
var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
|
||||
for (var a = 0; a < dr.FieldCount; a++)
|
||||
for (var a = 0; a < fetch.Object.FieldCount; a++)
|
||||
{
|
||||
var name = dr.GetName(a);
|
||||
var name = fetch.Object.GetName(a);
|
||||
if (dic.ContainsKey(name)) continue;
|
||||
sbflag.Append(name).Append(":").Append(a).Append(",");
|
||||
dic.Add(name, a);
|
||||
@ -492,16 +492,16 @@ namespace FreeSql.Internal.CommonProvider
|
||||
indexes4 = props4.Select(a => dic.TryGetValue(a.Key, out var tryint) ? tryint : -1).ToArray();
|
||||
flag4 = sbflag.ToString();
|
||||
}
|
||||
ret4.Add((T4)Utils.ExecuteArrayRowReadClassOrTuple(flag4, type4, indexes4, dr, 0, _util).Value);
|
||||
ret4.Add((T4)Utils.ExecuteArrayRowReadClassOrTuple(flag4, type4, indexes4, fetch.Object, 0, _util).Value);
|
||||
break;
|
||||
case 4:
|
||||
if (indexes5 == null)
|
||||
{
|
||||
var sbflag = new StringBuilder().Append("adoQuery");
|
||||
var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
|
||||
for (var a = 0; a < dr.FieldCount; a++)
|
||||
for (var a = 0; a < fetch.Object.FieldCount; a++)
|
||||
{
|
||||
var name = dr.GetName(a);
|
||||
var name = fetch.Object.GetName(a);
|
||||
if (dic.ContainsKey(name)) continue;
|
||||
sbflag.Append(name).Append(":").Append(a).Append(",");
|
||||
dic.Add(name, a);
|
||||
@ -509,7 +509,7 @@ namespace FreeSql.Internal.CommonProvider
|
||||
indexes5 = props5.Select(a => dic.TryGetValue(a.Key, out var tryint) ? tryint : -1).ToArray();
|
||||
flag5 = sbflag.ToString();
|
||||
}
|
||||
ret5.Add((T5)Utils.ExecuteArrayRowReadClassOrTuple(flag5, type5, indexes5, dr, 0, _util).Value);
|
||||
ret5.Add((T5)Utils.ExecuteArrayRowReadClassOrTuple(flag5, type5, indexes5, fetch.Object, 0, _util).Value);
|
||||
break;
|
||||
}
|
||||
}, cmdType, cmdText, cmdParms);
|
||||
@ -517,13 +517,13 @@ namespace FreeSql.Internal.CommonProvider
|
||||
}
|
||||
#endregion
|
||||
|
||||
public void ExecuteReader(Action<DbDataReader> readerHander, string cmdText, object parms = null) => ExecuteReader(null, null, readerHander, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
|
||||
public void ExecuteReader(DbTransaction transaction, Action<DbDataReader> readerHander, string cmdText, object parms = null) => ExecuteReader(null, transaction, readerHander, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
|
||||
public void ExecuteReader(DbConnection connection, DbTransaction transaction, Action<DbDataReader> readerHander, string cmdText, object parms = null) => ExecuteReader(connection, transaction, readerHander, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
|
||||
public void ExecuteReader(Action<DbDataReader> readerHander, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => ExecuteReader(null, null, readerHander, cmdType, cmdText, cmdParms);
|
||||
public void ExecuteReader(DbTransaction transaction, Action<DbDataReader> readerHander, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => ExecuteReader(null, transaction, readerHander, cmdType, cmdText, cmdParms);
|
||||
public void ExecuteReader(DbConnection connection, DbTransaction transaction, Action<DbDataReader> readerHander, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => ExecuteReaderMultiple(1, connection, transaction, (dr, result) => readerHander(dr), cmdType, cmdText, cmdParms);
|
||||
void ExecuteReaderMultiple(int multipleResult, DbConnection connection, DbTransaction transaction, Action<DbDataReader, int> readerHander, CommandType cmdType, string cmdText, params DbParameter[] cmdParms)
|
||||
public void ExecuteReader(Action<FetchCallbackArgs<DbDataReader>> fetchHandler, string cmdText, object parms = null) => ExecuteReader(null, null, fetchHandler, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
|
||||
public void ExecuteReader(DbTransaction transaction, Action<FetchCallbackArgs<DbDataReader>> fetchHandler, string cmdText, object parms = null) => ExecuteReader(null, transaction, fetchHandler, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
|
||||
public void ExecuteReader(DbConnection connection, DbTransaction transaction, Action<FetchCallbackArgs<DbDataReader>> fetchHandler, string cmdText, object parms = null) => ExecuteReader(connection, transaction, fetchHandler, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
|
||||
public void ExecuteReader(Action<FetchCallbackArgs<DbDataReader>> fetchHandler, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => ExecuteReader(null, null, fetchHandler, cmdType, cmdText, cmdParms);
|
||||
public void ExecuteReader(DbTransaction transaction, Action<FetchCallbackArgs<DbDataReader>> fetchHandler, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => ExecuteReader(null, transaction, fetchHandler, cmdType, cmdText, cmdParms);
|
||||
public void ExecuteReader(DbConnection connection, DbTransaction transaction, Action<FetchCallbackArgs<DbDataReader>> fetchHandler, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => ExecuteReaderMultiple(1, connection, transaction, (fetch, result) => fetchHandler(fetch), cmdType, cmdText, cmdParms);
|
||||
void ExecuteReaderMultiple(int multipleResult, DbConnection connection, DbTransaction transaction, Action<FetchCallbackArgs<DbDataReader>, int> fetchHandler, CommandType cmdType, string cmdText, params DbParameter[] cmdParms)
|
||||
{
|
||||
if (string.IsNullOrEmpty(cmdText)) return;
|
||||
var dt = DateTime.Now;
|
||||
@ -586,7 +586,7 @@ namespace FreeSql.Internal.CommonProvider
|
||||
LoggerException(pool, pc, new Exception($"连接失败,准备切换其他可用服务器"), dt, logtxt, false);
|
||||
pc.cmd.Parameters.Clear();
|
||||
if (DataType == DataType.Sqlite) pc.cmd.Dispose();
|
||||
ExecuteReaderMultiple(multipleResult, connection, transaction, readerHander, cmdType, cmdText, cmdParms);
|
||||
ExecuteReaderMultiple(multipleResult, connection, transaction, fetchHandler, cmdType, cmdText, cmdParms);
|
||||
return;
|
||||
}
|
||||
}
|
||||
@ -603,6 +603,7 @@ namespace FreeSql.Internal.CommonProvider
|
||||
using (var dr = pc.cmd.ExecuteReader())
|
||||
{
|
||||
int resultIndex = 0;
|
||||
var fetch = new FetchCallbackArgs<DbDataReader> { Object = dr };
|
||||
while (true)
|
||||
{
|
||||
while (true)
|
||||
@ -610,8 +611,15 @@ namespace FreeSql.Internal.CommonProvider
|
||||
bool isread = dr.Read();
|
||||
if (isread == false) break;
|
||||
|
||||
if (readerHander != null)
|
||||
readerHander(dr, resultIndex);
|
||||
if (fetchHandler != null)
|
||||
{
|
||||
fetchHandler(fetch, resultIndex);
|
||||
if (fetch.IsBreak)
|
||||
{
|
||||
resultIndex = multipleResult;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (++resultIndex >= multipleResult || dr.NextResult() == false) break;
|
||||
}
|
||||
@ -649,10 +657,10 @@ namespace FreeSql.Internal.CommonProvider
|
||||
public object[][] ExecuteArray(DbConnection connection, DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms)
|
||||
{
|
||||
List<object[]> ret = new List<object[]>();
|
||||
ExecuteReader(connection, transaction, dr =>
|
||||
ExecuteReader(connection, transaction, fetch =>
|
||||
{
|
||||
object[] values = new object[dr.FieldCount];
|
||||
dr.GetValues(values);
|
||||
object[] values = new object[fetch.Object.FieldCount];
|
||||
fetch.Object.GetValues(values);
|
||||
ret.Add(values);
|
||||
}, cmdType, cmdText, cmdParms);
|
||||
return ret.ToArray();
|
||||
@ -666,20 +674,20 @@ namespace FreeSql.Internal.CommonProvider
|
||||
{
|
||||
var ret = new DataSet();
|
||||
DataTable dt = null;
|
||||
ExecuteReaderMultiple(16, connection, transaction, (dr, result) =>
|
||||
ExecuteReaderMultiple(16, connection, transaction, (fetch, result) =>
|
||||
{
|
||||
if (ret.Tables.Count <= result)
|
||||
{
|
||||
dt = ret.Tables.Add();
|
||||
for (var a = 0; a < dr.FieldCount; a++)
|
||||
for (var a = 0; a < fetch.Object.FieldCount; a++)
|
||||
{
|
||||
var name = dr.GetName(a);
|
||||
var name = fetch.Object.GetName(a);
|
||||
if (dt.Columns.Contains(name)) name = $"{name}_{Guid.NewGuid().ToString("N").Substring(0, 4)}";
|
||||
dt.Columns.Add(name, dr.GetFieldType(a));
|
||||
dt.Columns.Add(name, fetch.Object.GetFieldType(a));
|
||||
}
|
||||
}
|
||||
object[] values = new object[dt.Columns.Count];
|
||||
dr.GetValues(values);
|
||||
fetch.Object.GetValues(values);
|
||||
dt.Rows.Add(values);
|
||||
}, cmdType, cmdText, cmdParms);
|
||||
return ret;
|
||||
@ -692,17 +700,17 @@ namespace FreeSql.Internal.CommonProvider
|
||||
public DataTable ExecuteDataTable(DbConnection connection, DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms)
|
||||
{
|
||||
var ret = new DataTable();
|
||||
ExecuteReader(connection, transaction, dr =>
|
||||
ExecuteReader(connection, transaction, fetch =>
|
||||
{
|
||||
if (ret.Columns.Count == 0)
|
||||
for (var a = 0; a < dr.FieldCount; a++)
|
||||
for (var a = 0; a < fetch.Object.FieldCount; a++)
|
||||
{
|
||||
var name = dr.GetName(a);
|
||||
var name = fetch.Object.GetName(a);
|
||||
if (ret.Columns.Contains(name)) name = $"{name}_{Guid.NewGuid().ToString("N").Substring(0, 4)}";
|
||||
ret.Columns.Add(name, dr.GetFieldType(a));
|
||||
ret.Columns.Add(name, fetch.Object.GetFieldType(a));
|
||||
}
|
||||
object[] values = new object[ret.Columns.Count];
|
||||
dr.GetValues(values);
|
||||
fetch.Object.GetValues(values);
|
||||
ret.Rows.Add(values);
|
||||
}, cmdType, cmdText, cmdParms);
|
||||
return ret;
|
||||
|
@ -29,15 +29,15 @@ namespace FreeSql.Internal.CommonProvider
|
||||
string flag = null;
|
||||
int[] indexes = null;
|
||||
var props = GetQueryTypeProperties(type);
|
||||
await ExecuteReaderAsync(connection, transaction, dr =>
|
||||
await ExecuteReaderAsync(connection, transaction, fetch =>
|
||||
{
|
||||
if (indexes == null)
|
||||
{
|
||||
var sbflag = new StringBuilder().Append("adoQuery");
|
||||
var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
|
||||
for (var a = 0; a < dr.FieldCount; a++)
|
||||
for (var a = 0; a < fetch.Object.FieldCount; a++)
|
||||
{
|
||||
var name = dr.GetName(a);
|
||||
var name = fetch.Object.GetName(a);
|
||||
if (dic.ContainsKey(name)) continue;
|
||||
sbflag.Append(name).Append(":").Append(a).Append(",");
|
||||
dic.Add(name, a);
|
||||
@ -45,7 +45,7 @@ namespace FreeSql.Internal.CommonProvider
|
||||
indexes = props.Select(a => dic.TryGetValue(a.Key, out var tryint) ? tryint : -1).ToArray();
|
||||
flag = sbflag.ToString();
|
||||
}
|
||||
ret.Add((T)Utils.ExecuteArrayRowReadClassOrTuple(flag, type, indexes, dr, 0, _util).Value);
|
||||
ret.Add((T)Utils.ExecuteArrayRowReadClassOrTuple(flag, type, indexes, fetch.Object, 0, _util).Value);
|
||||
return Task.FromResult(false);
|
||||
}, cmdType, cmdText, cmdParms);
|
||||
return ret;
|
||||
@ -70,7 +70,7 @@ namespace FreeSql.Internal.CommonProvider
|
||||
string flag2 = null;
|
||||
int[] indexes2 = null;
|
||||
var props2 = GetQueryTypeProperties(type2);
|
||||
await ExecuteReaderMultipleAsync(2, connection, transaction, (dr, result) =>
|
||||
await ExecuteReaderMultipleAsync(2, connection, transaction, (fetch, result) =>
|
||||
{
|
||||
switch (result)
|
||||
{
|
||||
@ -79,9 +79,9 @@ namespace FreeSql.Internal.CommonProvider
|
||||
{
|
||||
var sbflag = new StringBuilder().Append("adoQuery");
|
||||
var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
|
||||
for (var a = 0; a < dr.FieldCount; a++)
|
||||
for (var a = 0; a < fetch.Object.FieldCount; a++)
|
||||
{
|
||||
var name = dr.GetName(a);
|
||||
var name = fetch.Object.GetName(a);
|
||||
if (dic.ContainsKey(name)) continue;
|
||||
sbflag.Append(name).Append(":").Append(a).Append(",");
|
||||
dic.Add(name, a);
|
||||
@ -89,16 +89,16 @@ namespace FreeSql.Internal.CommonProvider
|
||||
indexes1 = props1.Select(a => dic.TryGetValue(a.Key, out var tryint) ? tryint : -1).ToArray();
|
||||
flag1 = sbflag.ToString();
|
||||
}
|
||||
ret1.Add((T1)Utils.ExecuteArrayRowReadClassOrTuple(flag1, type1, indexes1, dr, 0, _util).Value);
|
||||
ret1.Add((T1)Utils.ExecuteArrayRowReadClassOrTuple(flag1, type1, indexes1, fetch.Object, 0, _util).Value);
|
||||
break;
|
||||
case 1:
|
||||
if (indexes2 == null)
|
||||
{
|
||||
var sbflag = new StringBuilder().Append("adoQuery");
|
||||
var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
|
||||
for (var a = 0; a < dr.FieldCount; a++)
|
||||
for (var a = 0; a < fetch.Object.FieldCount; a++)
|
||||
{
|
||||
var name = dr.GetName(a);
|
||||
var name = fetch.Object.GetName(a);
|
||||
if (dic.ContainsKey(name)) continue;
|
||||
sbflag.Append(name).Append(":").Append(a).Append(",");
|
||||
dic.Add(name, a);
|
||||
@ -106,7 +106,7 @@ namespace FreeSql.Internal.CommonProvider
|
||||
indexes2 = props2.Select(a => dic.TryGetValue(a.Key, out var tryint) ? tryint : -1).ToArray();
|
||||
flag2 = sbflag.ToString();
|
||||
}
|
||||
ret2.Add((T2)Utils.ExecuteArrayRowReadClassOrTuple(flag2, type2, indexes2, dr, 0, _util).Value);
|
||||
ret2.Add((T2)Utils.ExecuteArrayRowReadClassOrTuple(flag2, type2, indexes2, fetch.Object, 0, _util).Value);
|
||||
break;
|
||||
}
|
||||
return Task.FromResult(false);
|
||||
@ -139,7 +139,7 @@ namespace FreeSql.Internal.CommonProvider
|
||||
string flag3 = null;
|
||||
int[] indexes3 = null;
|
||||
var props3 = GetQueryTypeProperties(type3);
|
||||
await ExecuteReaderMultipleAsync(3, connection, transaction, (dr, result) =>
|
||||
await ExecuteReaderMultipleAsync(3, connection, transaction, (fetch, result) =>
|
||||
{
|
||||
switch (result)
|
||||
{
|
||||
@ -148,9 +148,9 @@ namespace FreeSql.Internal.CommonProvider
|
||||
{
|
||||
var sbflag = new StringBuilder().Append("adoQuery");
|
||||
var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
|
||||
for (var a = 0; a < dr.FieldCount; a++)
|
||||
for (var a = 0; a < fetch.Object.FieldCount; a++)
|
||||
{
|
||||
var name = dr.GetName(a);
|
||||
var name = fetch.Object.GetName(a);
|
||||
if (dic.ContainsKey(name)) continue;
|
||||
sbflag.Append(name).Append(":").Append(a).Append(",");
|
||||
dic.Add(name, a);
|
||||
@ -158,16 +158,16 @@ namespace FreeSql.Internal.CommonProvider
|
||||
indexes1 = props1.Select(a => dic.TryGetValue(a.Key, out var tryint) ? tryint : -1).ToArray();
|
||||
flag1 = sbflag.ToString();
|
||||
}
|
||||
ret1.Add((T1)Utils.ExecuteArrayRowReadClassOrTuple(flag1, type1, indexes1, dr, 0, _util).Value);
|
||||
ret1.Add((T1)Utils.ExecuteArrayRowReadClassOrTuple(flag1, type1, indexes1, fetch.Object, 0, _util).Value);
|
||||
break;
|
||||
case 1:
|
||||
if (indexes2 == null)
|
||||
{
|
||||
var sbflag = new StringBuilder().Append("adoQuery");
|
||||
var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
|
||||
for (var a = 0; a < dr.FieldCount; a++)
|
||||
for (var a = 0; a < fetch.Object.FieldCount; a++)
|
||||
{
|
||||
var name = dr.GetName(a);
|
||||
var name = fetch.Object.GetName(a);
|
||||
if (dic.ContainsKey(name)) continue;
|
||||
sbflag.Append(name).Append(":").Append(a).Append(",");
|
||||
dic.Add(name, a);
|
||||
@ -175,16 +175,16 @@ namespace FreeSql.Internal.CommonProvider
|
||||
indexes2 = props2.Select(a => dic.TryGetValue(a.Key, out var tryint) ? tryint : -1).ToArray();
|
||||
flag2 = sbflag.ToString();
|
||||
}
|
||||
ret2.Add((T2)Utils.ExecuteArrayRowReadClassOrTuple(flag2, type2, indexes2, dr, 0, _util).Value);
|
||||
ret2.Add((T2)Utils.ExecuteArrayRowReadClassOrTuple(flag2, type2, indexes2, fetch.Object, 0, _util).Value);
|
||||
break;
|
||||
case 2:
|
||||
if (indexes3 == null)
|
||||
{
|
||||
var sbflag = new StringBuilder().Append("adoQuery");
|
||||
var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
|
||||
for (var a = 0; a < dr.FieldCount; a++)
|
||||
for (var a = 0; a < fetch.Object.FieldCount; a++)
|
||||
{
|
||||
var name = dr.GetName(a);
|
||||
var name = fetch.Object.GetName(a);
|
||||
if (dic.ContainsKey(name)) continue;
|
||||
sbflag.Append(name).Append(":").Append(a).Append(",");
|
||||
dic.Add(name, a);
|
||||
@ -192,7 +192,7 @@ namespace FreeSql.Internal.CommonProvider
|
||||
indexes3 = props3.Select(a => dic.TryGetValue(a.Key, out var tryint) ? tryint : -1).ToArray();
|
||||
flag3 = sbflag.ToString();
|
||||
}
|
||||
ret3.Add((T3)Utils.ExecuteArrayRowReadClassOrTuple(flag3, type3, indexes3, dr, 0, _util).Value);
|
||||
ret3.Add((T3)Utils.ExecuteArrayRowReadClassOrTuple(flag3, type3, indexes3, fetch.Object, 0, _util).Value);
|
||||
break;
|
||||
}
|
||||
return Task.FromResult(false);
|
||||
@ -231,7 +231,7 @@ namespace FreeSql.Internal.CommonProvider
|
||||
string flag4 = null;
|
||||
int[] indexes4 = null;
|
||||
var props4 = GetQueryTypeProperties(type4);
|
||||
await ExecuteReaderMultipleAsync(4, connection, transaction, (dr, result) =>
|
||||
await ExecuteReaderMultipleAsync(4, connection, transaction, (fetch, result) =>
|
||||
{
|
||||
switch (result)
|
||||
{
|
||||
@ -240,9 +240,9 @@ namespace FreeSql.Internal.CommonProvider
|
||||
{
|
||||
var sbflag = new StringBuilder().Append("adoQuery");
|
||||
var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
|
||||
for (var a = 0; a < dr.FieldCount; a++)
|
||||
for (var a = 0; a < fetch.Object.FieldCount; a++)
|
||||
{
|
||||
var name = dr.GetName(a);
|
||||
var name = fetch.Object.GetName(a);
|
||||
if (dic.ContainsKey(name)) continue;
|
||||
sbflag.Append(name).Append(":").Append(a).Append(",");
|
||||
dic.Add(name, a);
|
||||
@ -250,16 +250,16 @@ namespace FreeSql.Internal.CommonProvider
|
||||
indexes1 = props1.Select(a => dic.TryGetValue(a.Key, out var tryint) ? tryint : -1).ToArray();
|
||||
flag1 = sbflag.ToString();
|
||||
}
|
||||
ret1.Add((T1)Utils.ExecuteArrayRowReadClassOrTuple(flag1, type1, indexes1, dr, 0, _util).Value);
|
||||
ret1.Add((T1)Utils.ExecuteArrayRowReadClassOrTuple(flag1, type1, indexes1, fetch.Object, 0, _util).Value);
|
||||
break;
|
||||
case 1:
|
||||
if (indexes2 == null)
|
||||
{
|
||||
var sbflag = new StringBuilder().Append("adoQuery");
|
||||
var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
|
||||
for (var a = 0; a < dr.FieldCount; a++)
|
||||
for (var a = 0; a < fetch.Object.FieldCount; a++)
|
||||
{
|
||||
var name = dr.GetName(a);
|
||||
var name = fetch.Object.GetName(a);
|
||||
if (dic.ContainsKey(name)) continue;
|
||||
sbflag.Append(name).Append(":").Append(a).Append(",");
|
||||
dic.Add(name, a);
|
||||
@ -267,16 +267,16 @@ namespace FreeSql.Internal.CommonProvider
|
||||
indexes2 = props2.Select(a => dic.TryGetValue(a.Key, out var tryint) ? tryint : -1).ToArray();
|
||||
flag2 = sbflag.ToString();
|
||||
}
|
||||
ret2.Add((T2)Utils.ExecuteArrayRowReadClassOrTuple(flag2, type2, indexes2, dr, 0, _util).Value);
|
||||
ret2.Add((T2)Utils.ExecuteArrayRowReadClassOrTuple(flag2, type2, indexes2, fetch.Object, 0, _util).Value);
|
||||
break;
|
||||
case 2:
|
||||
if (indexes3 == null)
|
||||
{
|
||||
var sbflag = new StringBuilder().Append("adoQuery");
|
||||
var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
|
||||
for (var a = 0; a < dr.FieldCount; a++)
|
||||
for (var a = 0; a < fetch.Object.FieldCount; a++)
|
||||
{
|
||||
var name = dr.GetName(a);
|
||||
var name = fetch.Object.GetName(a);
|
||||
if (dic.ContainsKey(name)) continue;
|
||||
sbflag.Append(name).Append(":").Append(a).Append(",");
|
||||
dic.Add(name, a);
|
||||
@ -284,16 +284,16 @@ namespace FreeSql.Internal.CommonProvider
|
||||
indexes3 = props3.Select(a => dic.TryGetValue(a.Key, out var tryint) ? tryint : -1).ToArray();
|
||||
flag3 = sbflag.ToString();
|
||||
}
|
||||
ret3.Add((T3)Utils.ExecuteArrayRowReadClassOrTuple(flag3, type3, indexes3, dr, 0, _util).Value);
|
||||
ret3.Add((T3)Utils.ExecuteArrayRowReadClassOrTuple(flag3, type3, indexes3, fetch.Object, 0, _util).Value);
|
||||
break;
|
||||
case 3:
|
||||
if (indexes4 == null)
|
||||
{
|
||||
var sbflag = new StringBuilder().Append("adoQuery");
|
||||
var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
|
||||
for (var a = 0; a < dr.FieldCount; a++)
|
||||
for (var a = 0; a < fetch.Object.FieldCount; a++)
|
||||
{
|
||||
var name = dr.GetName(a);
|
||||
var name = fetch.Object.GetName(a);
|
||||
if (dic.ContainsKey(name)) continue;
|
||||
sbflag.Append(name).Append(":").Append(a).Append(",");
|
||||
dic.Add(name, a);
|
||||
@ -301,7 +301,7 @@ namespace FreeSql.Internal.CommonProvider
|
||||
indexes4 = props4.Select(a => dic.TryGetValue(a.Key, out var tryint) ? tryint : -1).ToArray();
|
||||
flag4 = sbflag.ToString();
|
||||
}
|
||||
ret4.Add((T4)Utils.ExecuteArrayRowReadClassOrTuple(flag4, type4, indexes4, dr, 0, _util).Value);
|
||||
ret4.Add((T4)Utils.ExecuteArrayRowReadClassOrTuple(flag4, type4, indexes4, fetch.Object, 0, _util).Value);
|
||||
break;
|
||||
}
|
||||
return Task.FromResult(false);
|
||||
@ -346,7 +346,7 @@ namespace FreeSql.Internal.CommonProvider
|
||||
string flag5 = null;
|
||||
int[] indexes5 = null;
|
||||
var props5 = GetQueryTypeProperties(type5);
|
||||
await ExecuteReaderMultipleAsync(5, connection, transaction, (dr, result) =>
|
||||
await ExecuteReaderMultipleAsync(5, connection, transaction, (fetch, result) =>
|
||||
{
|
||||
switch (result)
|
||||
{
|
||||
@ -355,9 +355,9 @@ namespace FreeSql.Internal.CommonProvider
|
||||
{
|
||||
var sbflag = new StringBuilder().Append("adoQuery");
|
||||
var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
|
||||
for (var a = 0; a < dr.FieldCount; a++)
|
||||
for (var a = 0; a < fetch.Object.FieldCount; a++)
|
||||
{
|
||||
var name = dr.GetName(a);
|
||||
var name = fetch.Object.GetName(a);
|
||||
if (dic.ContainsKey(name)) continue;
|
||||
sbflag.Append(name).Append(":").Append(a).Append(",");
|
||||
dic.Add(name, a);
|
||||
@ -365,16 +365,16 @@ namespace FreeSql.Internal.CommonProvider
|
||||
indexes1 = props1.Select(a => dic.TryGetValue(a.Key, out var tryint) ? tryint : -1).ToArray();
|
||||
flag1 = sbflag.ToString();
|
||||
}
|
||||
ret1.Add((T1)Utils.ExecuteArrayRowReadClassOrTuple(flag1, type1, indexes1, dr, 0, _util).Value);
|
||||
ret1.Add((T1)Utils.ExecuteArrayRowReadClassOrTuple(flag1, type1, indexes1, fetch.Object, 0, _util).Value);
|
||||
break;
|
||||
case 1:
|
||||
if (indexes2 == null)
|
||||
{
|
||||
var sbflag = new StringBuilder().Append("adoQuery");
|
||||
var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
|
||||
for (var a = 0; a < dr.FieldCount; a++)
|
||||
for (var a = 0; a < fetch.Object.FieldCount; a++)
|
||||
{
|
||||
var name = dr.GetName(a);
|
||||
var name = fetch.Object.GetName(a);
|
||||
if (dic.ContainsKey(name)) continue;
|
||||
sbflag.Append(name).Append(":").Append(a).Append(",");
|
||||
dic.Add(name, a);
|
||||
@ -382,16 +382,16 @@ namespace FreeSql.Internal.CommonProvider
|
||||
indexes2 = props2.Select(a => dic.TryGetValue(a.Key, out var tryint) ? tryint : -1).ToArray();
|
||||
flag2 = sbflag.ToString();
|
||||
}
|
||||
ret2.Add((T2)Utils.ExecuteArrayRowReadClassOrTuple(flag2, type2, indexes2, dr, 0, _util).Value);
|
||||
ret2.Add((T2)Utils.ExecuteArrayRowReadClassOrTuple(flag2, type2, indexes2, fetch.Object, 0, _util).Value);
|
||||
break;
|
||||
case 2:
|
||||
if (indexes3 == null)
|
||||
{
|
||||
var sbflag = new StringBuilder().Append("adoQuery");
|
||||
var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
|
||||
for (var a = 0; a < dr.FieldCount; a++)
|
||||
for (var a = 0; a < fetch.Object.FieldCount; a++)
|
||||
{
|
||||
var name = dr.GetName(a);
|
||||
var name = fetch.Object.GetName(a);
|
||||
if (dic.ContainsKey(name)) continue;
|
||||
sbflag.Append(name).Append(":").Append(a).Append(",");
|
||||
dic.Add(name, a);
|
||||
@ -399,16 +399,16 @@ namespace FreeSql.Internal.CommonProvider
|
||||
indexes3 = props3.Select(a => dic.TryGetValue(a.Key, out var tryint) ? tryint : -1).ToArray();
|
||||
flag3 = sbflag.ToString();
|
||||
}
|
||||
ret3.Add((T3)Utils.ExecuteArrayRowReadClassOrTuple(flag3, type3, indexes3, dr, 0, _util).Value);
|
||||
ret3.Add((T3)Utils.ExecuteArrayRowReadClassOrTuple(flag3, type3, indexes3, fetch.Object, 0, _util).Value);
|
||||
break;
|
||||
case 3:
|
||||
if (indexes4 == null)
|
||||
{
|
||||
var sbflag = new StringBuilder().Append("adoQuery");
|
||||
var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
|
||||
for (var a = 0; a < dr.FieldCount; a++)
|
||||
for (var a = 0; a < fetch.Object.FieldCount; a++)
|
||||
{
|
||||
var name = dr.GetName(a);
|
||||
var name = fetch.Object.GetName(a);
|
||||
if (dic.ContainsKey(name)) continue;
|
||||
sbflag.Append(name).Append(":").Append(a).Append(",");
|
||||
dic.Add(name, a);
|
||||
@ -416,16 +416,16 @@ namespace FreeSql.Internal.CommonProvider
|
||||
indexes4 = props4.Select(a => dic.TryGetValue(a.Key, out var tryint) ? tryint : -1).ToArray();
|
||||
flag4 = sbflag.ToString();
|
||||
}
|
||||
ret4.Add((T4)Utils.ExecuteArrayRowReadClassOrTuple(flag4, type4, indexes4, dr, 0, _util).Value);
|
||||
ret4.Add((T4)Utils.ExecuteArrayRowReadClassOrTuple(flag4, type4, indexes4, fetch.Object, 0, _util).Value);
|
||||
break;
|
||||
case 4:
|
||||
if (indexes5 == null)
|
||||
{
|
||||
var sbflag = new StringBuilder().Append("adoQuery");
|
||||
var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
|
||||
for (var a = 0; a < dr.FieldCount; a++)
|
||||
for (var a = 0; a < fetch.Object.FieldCount; a++)
|
||||
{
|
||||
var name = dr.GetName(a);
|
||||
var name = fetch.Object.GetName(a);
|
||||
if (dic.ContainsKey(name)) continue;
|
||||
sbflag.Append(name).Append(":").Append(a).Append(",");
|
||||
dic.Add(name, a);
|
||||
@ -433,7 +433,7 @@ namespace FreeSql.Internal.CommonProvider
|
||||
indexes5 = props5.Select(a => dic.TryGetValue(a.Key, out var tryint) ? tryint : -1).ToArray();
|
||||
flag5 = sbflag.ToString();
|
||||
}
|
||||
ret5.Add((T5)Utils.ExecuteArrayRowReadClassOrTuple(flag5, type5, indexes5, dr, 0, _util).Value);
|
||||
ret5.Add((T5)Utils.ExecuteArrayRowReadClassOrTuple(flag5, type5, indexes5, fetch.Object, 0, _util).Value);
|
||||
break;
|
||||
}
|
||||
return Task.FromResult(false);
|
||||
@ -442,13 +442,13 @@ namespace FreeSql.Internal.CommonProvider
|
||||
}
|
||||
#endregion
|
||||
|
||||
public Task ExecuteReaderAsync(Func<DbDataReader, Task> readerHander, string cmdText, object parms = null) => ExecuteReaderAsync(null, null, readerHander, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
|
||||
public Task ExecuteReaderAsync(DbTransaction transaction, Func<DbDataReader, Task> readerHander, string cmdText, object parms = null) => ExecuteReaderAsync(null, transaction, readerHander, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
|
||||
public Task ExecuteReaderAsync(DbConnection connection, DbTransaction transaction, Func<DbDataReader, Task> readerHander, string cmdText, object parms = null) => ExecuteReaderAsync(connection, transaction, readerHander, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
|
||||
public Task ExecuteReaderAsync(Func<DbDataReader, Task> readerHander, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => ExecuteReaderAsync(null, null, readerHander, cmdType, cmdText, cmdParms);
|
||||
public Task ExecuteReaderAsync(DbTransaction transaction, Func<DbDataReader, Task> readerHander, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => ExecuteReaderAsync(null, transaction, readerHander, cmdType, cmdText, cmdParms);
|
||||
public Task ExecuteReaderAsync(DbConnection connection, DbTransaction transaction, Func<DbDataReader, Task> readerHander, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => ExecuteReaderMultipleAsync(1, connection, transaction, (dr, result) => readerHander(dr), cmdType, cmdText, cmdParms);
|
||||
async Task ExecuteReaderMultipleAsync(int multipleResult, DbConnection connection, DbTransaction transaction, Func<DbDataReader, int, Task> readerHander, CommandType cmdType, string cmdText, params DbParameter[] cmdParms)
|
||||
public Task ExecuteReaderAsync(Func<FetchCallbackArgs<DbDataReader>, Task> fetchHandler, string cmdText, object parms = null) => ExecuteReaderAsync(null, null, fetchHandler, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
|
||||
public Task ExecuteReaderAsync(DbTransaction transaction, Func<FetchCallbackArgs<DbDataReader>, Task> fetchHandler, string cmdText, object parms = null) => ExecuteReaderAsync(null, transaction, fetchHandler, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
|
||||
public Task ExecuteReaderAsync(DbConnection connection, DbTransaction transaction, Func<FetchCallbackArgs<DbDataReader>, Task> fetchHandler, string cmdText, object parms = null) => ExecuteReaderAsync(connection, transaction, fetchHandler, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
|
||||
public Task ExecuteReaderAsync(Func<FetchCallbackArgs<DbDataReader>, Task> fetchHandler, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => ExecuteReaderAsync(null, null, fetchHandler, cmdType, cmdText, cmdParms);
|
||||
public Task ExecuteReaderAsync(DbTransaction transaction, Func<FetchCallbackArgs<DbDataReader>, Task> fetchHandler, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => ExecuteReaderAsync(null, transaction, fetchHandler, cmdType, cmdText, cmdParms);
|
||||
public Task ExecuteReaderAsync(DbConnection connection, DbTransaction transaction, Func<FetchCallbackArgs<DbDataReader>, Task> fetchHandler, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => ExecuteReaderMultipleAsync(1, connection, transaction, (fetch, result) => fetchHandler(fetch), cmdType, cmdText, cmdParms);
|
||||
async Task ExecuteReaderMultipleAsync(int multipleResult, DbConnection connection, DbTransaction transaction, Func<FetchCallbackArgs<DbDataReader>, int, Task> fetchHandler, CommandType cmdType, string cmdText, params DbParameter[] cmdParms)
|
||||
{
|
||||
if (string.IsNullOrEmpty(cmdText)) return;
|
||||
var dt = DateTime.Now;
|
||||
@ -511,7 +511,7 @@ namespace FreeSql.Internal.CommonProvider
|
||||
LoggerException(pool, pc, new Exception($"连接失败,准备切换其他可用服务器"), dt, logtxt, false);
|
||||
pc.cmd.Parameters.Clear();
|
||||
if (DataType == DataType.Sqlite) pc.cmd.Dispose();
|
||||
await ExecuteReaderMultipleAsync(multipleResult, connection, transaction, readerHander, cmdType, cmdText, cmdParms);
|
||||
await ExecuteReaderMultipleAsync(multipleResult, connection, transaction, fetchHandler, cmdType, cmdText, cmdParms);
|
||||
return;
|
||||
}
|
||||
}
|
||||
@ -528,6 +528,7 @@ namespace FreeSql.Internal.CommonProvider
|
||||
using (var dr = await pc.cmd.ExecuteReaderAsync())
|
||||
{
|
||||
int resultIndex = 0;
|
||||
var fetch = new FetchCallbackArgs<DbDataReader> { Object = dr };
|
||||
while (true)
|
||||
{
|
||||
while (true)
|
||||
@ -535,8 +536,15 @@ namespace FreeSql.Internal.CommonProvider
|
||||
bool isread = await dr.ReadAsync();
|
||||
if (isread == false) break;
|
||||
|
||||
if (readerHander != null)
|
||||
await readerHander(dr, resultIndex);
|
||||
if (fetchHandler != null)
|
||||
{
|
||||
await fetchHandler(fetch, resultIndex);
|
||||
if (fetch.IsBreak)
|
||||
{
|
||||
resultIndex = multipleResult;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (++resultIndex >= multipleResult || dr.NextResult() == false) break;
|
||||
}
|
||||
@ -571,10 +579,10 @@ namespace FreeSql.Internal.CommonProvider
|
||||
async public Task<object[][]> ExecuteArrayAsync(DbConnection connection, DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms)
|
||||
{
|
||||
List<object[]> ret = new List<object[]>();
|
||||
await ExecuteReaderAsync(connection, transaction, async dr =>
|
||||
await ExecuteReaderAsync(connection, transaction, async fetch =>
|
||||
{
|
||||
object[] values = new object[dr.FieldCount];
|
||||
for (int a = 0; a < values.Length; a++) if (!await dr.IsDBNullAsync(a)) values[a] = await dr.GetFieldValueAsync<object>(a);
|
||||
object[] values = new object[fetch.Object.FieldCount];
|
||||
for (int a = 0; a < values.Length; a++) if (!await fetch.Object.IsDBNullAsync(a)) values[a] = await fetch.Object.GetFieldValueAsync<object>(a);
|
||||
ret.Add(values);
|
||||
}, cmdType, cmdText, cmdParms);
|
||||
return ret.ToArray();
|
||||
@ -589,20 +597,20 @@ namespace FreeSql.Internal.CommonProvider
|
||||
{
|
||||
var ret = new DataSet();
|
||||
DataTable dt = null;
|
||||
await ExecuteReaderMultipleAsync(16, connection, transaction, async (dr, result) =>
|
||||
await ExecuteReaderMultipleAsync(16, connection, transaction, async (fetch, result) =>
|
||||
{
|
||||
if (ret.Tables.Count <= result)
|
||||
{
|
||||
dt = ret.Tables.Add();
|
||||
for (var a = 0; a < dr.FieldCount; a++)
|
||||
for (var a = 0; a < fetch.Object.FieldCount; a++)
|
||||
{
|
||||
var name = dr.GetName(a);
|
||||
var name = fetch.Object.GetName(a);
|
||||
if (dt.Columns.Contains(name)) name = $"{name}_{Guid.NewGuid().ToString("N").Substring(0, 4)}";
|
||||
dt.Columns.Add(name, dr.GetFieldType(a));
|
||||
dt.Columns.Add(name, fetch.Object.GetFieldType(a));
|
||||
}
|
||||
}
|
||||
object[] values = new object[dt.Columns.Count];
|
||||
for (int a = 0; a < values.Length; a++) if (!await dr.IsDBNullAsync(a)) values[a] = await dr.GetFieldValueAsync<object>(a);
|
||||
for (int a = 0; a < values.Length; a++) if (!await fetch.Object.IsDBNullAsync(a)) values[a] = await fetch.Object.GetFieldValueAsync<object>(a);
|
||||
dt.Rows.Add(values);
|
||||
}, cmdType, cmdText, cmdParms);
|
||||
return ret;
|
||||
@ -615,17 +623,17 @@ namespace FreeSql.Internal.CommonProvider
|
||||
async public Task<DataTable> ExecuteDataTableAsync(DbConnection connection, DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms)
|
||||
{
|
||||
var ret = new DataTable();
|
||||
await ExecuteReaderAsync(connection, transaction, async dr =>
|
||||
await ExecuteReaderAsync(connection, transaction, async fetch =>
|
||||
{
|
||||
if (ret.Columns.Count == 0)
|
||||
for (var a = 0; a < dr.FieldCount; a++)
|
||||
for (var a = 0; a < fetch.Object.FieldCount; a++)
|
||||
{
|
||||
var name = dr.GetName(a);
|
||||
var name = fetch.Object.GetName(a);
|
||||
if (ret.Columns.Contains(name)) name = $"{name}_{Guid.NewGuid().ToString("N").Substring(0, 4)}";
|
||||
ret.Columns.Add(name, dr.GetFieldType(a));
|
||||
ret.Columns.Add(name, fetch.Object.GetFieldType(a));
|
||||
}
|
||||
object[] values = new object[ret.Columns.Count];
|
||||
for (int a = 0; a < values.Length; a++) if (!await dr.IsDBNullAsync(a)) values[a] = await dr.GetFieldValueAsync<object>(a);
|
||||
for (int a = 0; a < values.Length; a++) if (!await fetch.Object.IsDBNullAsync(a)) values[a] = await fetch.Object.GetFieldValueAsync<object>(a);
|
||||
ret.Rows.Add(values);
|
||||
}, cmdType, cmdText, cmdParms);
|
||||
return ret;
|
||||
|
@ -341,9 +341,9 @@ namespace FreeSql.Internal.CommonProvider
|
||||
Exception exception = null;
|
||||
try
|
||||
{
|
||||
_orm.Ado.ExecuteReader(_connection, _transaction, dr =>
|
||||
_orm.Ado.ExecuteReader(_connection, _transaction, fetch =>
|
||||
{
|
||||
var read = Utils.ExecuteArrayRowReadClassOrTuple(flagStr, type, null, dr, 0, _commonUtils);
|
||||
var read = Utils.ExecuteArrayRowReadClassOrTuple(flagStr, type, null, fetch.Object, 0, _commonUtils);
|
||||
ret.Add((TTuple)read.Value);
|
||||
}, CommandType.Text, sql, dbParms);
|
||||
}
|
||||
@ -368,14 +368,14 @@ namespace FreeSql.Internal.CommonProvider
|
||||
Exception exception = null;
|
||||
try
|
||||
{
|
||||
_orm.Ado.ExecuteReader(_connection, _transaction, dr =>
|
||||
_orm.Ado.ExecuteReader(_connection, _transaction, fetch =>
|
||||
{
|
||||
ret.Add(af.Read(_orm, dr));
|
||||
ret.Add(af.Read(_orm, fetch.Object));
|
||||
if (otherData != null)
|
||||
{
|
||||
var idx = af.FieldCount - 1;
|
||||
foreach (var other in otherData)
|
||||
other.retlist.Add(_commonExpression.ReadAnonymous(other.read, dr, ref idx, false, null));
|
||||
other.retlist.Add(_commonExpression.ReadAnonymous(other.read, fetch.Object, ref idx, false, null));
|
||||
}
|
||||
}, CommandType.Text, sql, dbParms);
|
||||
}
|
||||
@ -409,37 +409,37 @@ namespace FreeSql.Internal.CommonProvider
|
||||
return ToListAfPrivate(sql, af, otherData);
|
||||
}
|
||||
#region ToChunk
|
||||
internal void ToListAfChunkPrivate(int chunkSize, Action<List<T1>> chunkDone, string sql, GetAllFieldExpressionTreeInfo af, ReadAnonymousTypeOtherInfo[] otherData)
|
||||
internal void ToListAfChunkPrivate(int chunkSize, Action<FetchCallbackArgs<List<T1>>> chunkDone, string sql, GetAllFieldExpressionTreeInfo af, ReadAnonymousTypeOtherInfo[] otherData)
|
||||
{
|
||||
var dbParms = _params.ToArray();
|
||||
var before = new Aop.CurdBeforeEventArgs(_tables[0].Table.Type, _tables[0].Table, Aop.CurdType.Select, sql, dbParms);
|
||||
_orm.Aop.CurdBeforeHandler?.Invoke(this, before);
|
||||
var ret = new List<T1>();
|
||||
var ret = new FetchCallbackArgs<List<T1>> { Object = new List<T1>() };
|
||||
var retCount = 0;
|
||||
Exception exception = null;
|
||||
var checkDoneTimes = 0;
|
||||
try
|
||||
{
|
||||
_orm.Ado.ExecuteReader(_connection, _transaction, dr =>
|
||||
_orm.Ado.ExecuteReader(_connection, _transaction, fetch =>
|
||||
{
|
||||
ret.Add(af.Read(_orm, dr));
|
||||
ret.Object.Add(af.Read(_orm, fetch.Object));
|
||||
retCount++;
|
||||
if (otherData != null)
|
||||
{
|
||||
var idx = af.FieldCount - 1;
|
||||
foreach (var other in otherData)
|
||||
other.retlist.Add(_commonExpression.ReadAnonymous(other.read, dr, ref idx, false, null));
|
||||
other.retlist.Add(_commonExpression.ReadAnonymous(other.read, fetch.Object, ref idx, false, null));
|
||||
}
|
||||
if (chunkSize > 0 && chunkSize == ret.Count)
|
||||
if (chunkSize > 0 && chunkSize == ret.Object.Count)
|
||||
{
|
||||
checkDoneTimes++;
|
||||
|
||||
foreach (var include in _includeToList) include?.Invoke(ret);
|
||||
_trackToList?.Invoke(ret);
|
||||
foreach (var include in _includeToList) include?.Invoke(ret.Object);
|
||||
_trackToList?.Invoke(ret.Object);
|
||||
chunkDone(ret);
|
||||
fetch.IsBreak = ret.IsBreak;
|
||||
|
||||
|
||||
ret.Clear();
|
||||
ret.Object.Clear();
|
||||
if (otherData != null)
|
||||
foreach (var other in otherData)
|
||||
other.retlist.Clear();
|
||||
@ -456,14 +456,14 @@ namespace FreeSql.Internal.CommonProvider
|
||||
var after = new Aop.CurdAfterEventArgs(before, exception, retCount);
|
||||
_orm.Aop.CurdAfterHandler?.Invoke(this, after);
|
||||
}
|
||||
if (ret.Any() || checkDoneTimes == 0)
|
||||
if (ret.Object.Any() || checkDoneTimes == 0)
|
||||
{
|
||||
foreach (var include in _includeToList) include?.Invoke(ret);
|
||||
_trackToList?.Invoke(ret);
|
||||
foreach (var include in _includeToList) include?.Invoke(ret.Object);
|
||||
_trackToList?.Invoke(ret.Object);
|
||||
chunkDone(ret);
|
||||
}
|
||||
}
|
||||
internal void ToListChunkPrivate(int chunkSize, Action<List<T1>> chunkDone, GetAllFieldExpressionTreeInfo af, ReadAnonymousTypeOtherInfo[] otherData)
|
||||
internal void ToListChunkPrivate(int chunkSize, Action<FetchCallbackArgs<List<T1>>> chunkDone, GetAllFieldExpressionTreeInfo af, ReadAnonymousTypeOtherInfo[] otherData)
|
||||
{
|
||||
string sql = null;
|
||||
if (otherData?.Length > 0)
|
||||
@ -478,7 +478,7 @@ namespace FreeSql.Internal.CommonProvider
|
||||
|
||||
ToListAfChunkPrivate(chunkSize, chunkDone, sql, af, otherData);
|
||||
}
|
||||
public void ToChunk(int size, Action<List<T1>> done, bool includeNestedMembers = false)
|
||||
public void ToChunk(int size, Action<FetchCallbackArgs<List<T1>>> done, bool includeNestedMembers = false)
|
||||
{
|
||||
if (_selectExpression != null) throw new ArgumentException("Chunk 功能之前不可使用 Select");
|
||||
this.ToListChunkPrivate(size, done, includeNestedMembers == false ? this.GetAllFieldExpressionTreeLevel2() : this.GetAllFieldExpressionTreeLevelAll(), null);
|
||||
@ -498,9 +498,9 @@ namespace FreeSql.Internal.CommonProvider
|
||||
Exception exception = null;
|
||||
try
|
||||
{
|
||||
_orm.Ado.ExecuteReader(_connection, _transaction, dr =>
|
||||
_orm.Ado.ExecuteReader(_connection, _transaction, fetch =>
|
||||
{
|
||||
var item = af.Read(_orm, dr);
|
||||
var item = af.Read(_orm, fetch.Object);
|
||||
ret.Add(keySelector(item), elementSelector(item));
|
||||
}, CommandType.Text, sql, dbParms);
|
||||
}
|
||||
@ -540,13 +540,13 @@ namespace FreeSql.Internal.CommonProvider
|
||||
Exception exception = null;
|
||||
try
|
||||
{
|
||||
_orm.Ado.ExecuteReader(_connection, _transaction, dr =>
|
||||
_orm.Ado.ExecuteReader(_connection, _transaction, fetch =>
|
||||
{
|
||||
var index = -1;
|
||||
ret.Add((TReturn)_commonExpression.ReadAnonymous(af.map, dr, ref index, false, null));
|
||||
ret.Add((TReturn)_commonExpression.ReadAnonymous(af.map, fetch.Object, ref index, false, null));
|
||||
if (otherData != null)
|
||||
foreach (var other in otherData)
|
||||
other.retlist.Add(_commonExpression.ReadAnonymous(other.read, dr, ref index, false, null));
|
||||
other.retlist.Add(_commonExpression.ReadAnonymous(other.read, fetch.Object, ref index, false, null));
|
||||
}, CommandType.Text, sql, dbParms);
|
||||
}
|
||||
catch (Exception ex)
|
||||
@ -1373,9 +1373,9 @@ namespace FreeSql.Internal.CommonProvider
|
||||
Exception exception = null;
|
||||
try
|
||||
{
|
||||
await _orm.Ado.ExecuteReaderAsync(_connection, _transaction, dr =>
|
||||
await _orm.Ado.ExecuteReaderAsync(_connection, _transaction, fetch =>
|
||||
{
|
||||
var read = Utils.ExecuteArrayRowReadClassOrTuple(flagStr, type, null, dr, 0, _commonUtils);
|
||||
var read = Utils.ExecuteArrayRowReadClassOrTuple(flagStr, type, null, fetch.Object, 0, _commonUtils);
|
||||
ret.Add((TTuple)read.Value);
|
||||
return Task.FromResult(false);
|
||||
}, CommandType.Text, sql, dbParms);
|
||||
@ -1402,14 +1402,14 @@ namespace FreeSql.Internal.CommonProvider
|
||||
Exception exception = null;
|
||||
try
|
||||
{
|
||||
await _orm.Ado.ExecuteReaderAsync(_connection, _transaction, dr =>
|
||||
await _orm.Ado.ExecuteReaderAsync(_connection, _transaction, fetch =>
|
||||
{
|
||||
ret.Add(af.Read(_orm, dr));
|
||||
ret.Add(af.Read(_orm, fetch.Object));
|
||||
if (otherData != null)
|
||||
{
|
||||
var idx = af.FieldCount - 1;
|
||||
foreach (var other in otherData)
|
||||
other.retlist.Add(_commonExpression.ReadAnonymous(other.read, dr, ref idx, false, null));
|
||||
other.retlist.Add(_commonExpression.ReadAnonymous(other.read, fetch.Object, ref idx, false, null));
|
||||
}
|
||||
return Task.FromResult(false);
|
||||
}, CommandType.Text, sql, dbParms);
|
||||
@ -1459,9 +1459,9 @@ namespace FreeSql.Internal.CommonProvider
|
||||
Exception exception = null;
|
||||
try
|
||||
{
|
||||
await _orm.Ado.ExecuteReaderAsync(_connection, _transaction, dr =>
|
||||
await _orm.Ado.ExecuteReaderAsync(_connection, _transaction, fetch =>
|
||||
{
|
||||
var item = af.Read(_orm, dr);
|
||||
var item = af.Read(_orm, fetch.Object);
|
||||
ret.Add(keySelector(item), elementSelector(item));
|
||||
return Task.FromResult(false);
|
||||
}, CommandType.Text, sql, dbParms);
|
||||
@ -1503,13 +1503,13 @@ namespace FreeSql.Internal.CommonProvider
|
||||
Exception exception = null;
|
||||
try
|
||||
{
|
||||
await _orm.Ado.ExecuteReaderAsync(_connection, _transaction, dr =>
|
||||
await _orm.Ado.ExecuteReaderAsync(_connection, _transaction, fetch =>
|
||||
{
|
||||
var index = -1;
|
||||
ret.Add((TReturn)_commonExpression.ReadAnonymous(af.map, dr, ref index, false, null));
|
||||
ret.Add((TReturn)_commonExpression.ReadAnonymous(af.map, fetch.Object, ref index, false, null));
|
||||
if (otherData != null)
|
||||
foreach (var other in otherData)
|
||||
other.retlist.Add(_commonExpression.ReadAnonymous(other.read, dr, ref index, false, null));
|
||||
other.retlist.Add(_commonExpression.ReadAnonymous(other.read, fetch.Object, ref index, false, null));
|
||||
return Task.FromResult(false);
|
||||
}, CommandType.Text, sql, dbParms);
|
||||
}
|
||||
|
16
FreeSql/Internal/Model/FetchCallbackArgs.cs
Normal file
16
FreeSql/Internal/Model/FetchCallbackArgs.cs
Normal file
@ -0,0 +1,16 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
namespace FreeSql.Internal.Model
|
||||
{
|
||||
public class FetchCallbackArgs<T>
|
||||
{
|
||||
public T Object { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 是否放弃继续读取
|
||||
/// </summary>
|
||||
public bool IsBreak { get; set; }
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user