mirror of
				https://github.com/nsnail/FreeSql.git
				synced 2025-11-04 17:20:49 +08:00 
			
		
		
		
	- 增加 ISelect.ToDataTable 系列方法;
- 增加 无参数化命令执行,便于调试;
This commit is contained in:
		@@ -5,6 +5,7 @@ using System.Collections.Concurrent;
 | 
			
		||||
using System.Text;
 | 
			
		||||
using System.Linq.Expressions;
 | 
			
		||||
using System.Linq;
 | 
			
		||||
using System.Data;
 | 
			
		||||
 | 
			
		||||
public static class FreeSqlRepositoryIFreeSqlExtenssions {
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -85,10 +85,23 @@ namespace FreeSql.Tests.MySql {
 | 
			
		||||
				.ToSql();
 | 
			
		||||
 | 
			
		||||
			var songs = g.mysql.Select<Song>().Limit(10).ToList();
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		[Fact]
 | 
			
		||||
		public void ToDataTable() {
 | 
			
		||||
			var items = new List<Topic>();
 | 
			
		||||
			for (var a = 0; a < 10; a++) items.Add(new Topic { Id = a + 1, Title = $"newtitle{a}", Clicks = a * 100, CreateTime = DateTime.Now });
 | 
			
		||||
 | 
			
		||||
			Assert.Equal(1, g.mysql.Insert<Topic>().AppendData(items.First()).ExecuteAffrows());
 | 
			
		||||
			Assert.Equal(10, g.mysql.Insert<Topic>().AppendData(items).ExecuteAffrows());
 | 
			
		||||
 | 
			
		||||
			items = Enumerable.Range(0, 9989).Select(a => new Topic { Title = "newtitle" + a, CreateTime = DateTime.Now }).ToList();
 | 
			
		||||
			Assert.Equal(9989, g.mysql.Insert<Topic>(items).ExecuteAffrows());
 | 
			
		||||
 | 
			
		||||
			var dt1 = select.Limit(10).ToDataTable();
 | 
			
		||||
			var dt2 = select.Limit(10).ToDataTable("id, 111222");
 | 
			
		||||
			var dt3 = select.Limit(10).ToDataTable(a => new { a.Id, a.Type.Name, now = DateTime.Now });
 | 
			
		||||
		}
 | 
			
		||||
		[Fact]
 | 
			
		||||
		public void ToList() {
 | 
			
		||||
			var t0 = select.Limit(50).ToList();
 | 
			
		||||
 
 | 
			
		||||
@@ -32,6 +32,21 @@ namespace FreeSql.Tests.Oracle {
 | 
			
		||||
			public List<TestTypeInfo> Types { get; set; }
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		[Fact]
 | 
			
		||||
		public void ToDataTable() {
 | 
			
		||||
			var items = new List<Topic>();
 | 
			
		||||
			for (var a = 0; a < 10; a++) items.Add(new Topic { Id = a + 1, Title = $"newtitle{a}", Clicks = a * 100, CreateTime = DateTime.Now });
 | 
			
		||||
 | 
			
		||||
			Assert.Equal(1, g.oracle.Insert<Topic>().AppendData(items.First()).ExecuteAffrows());
 | 
			
		||||
			Assert.Equal(10, g.oracle.Insert<Topic>().AppendData(items).ExecuteAffrows());
 | 
			
		||||
 | 
			
		||||
			items = Enumerable.Range(0, 9989).Select(a => new Topic { Title = "newtitle" + a, CreateTime = DateTime.Now }).ToList();
 | 
			
		||||
			Assert.Equal(9989, g.oracle.Insert<Topic>(items).ExecuteAffrows());
 | 
			
		||||
 | 
			
		||||
			var dt1 = select.Limit(10).ToDataTable();
 | 
			
		||||
			var dt2 = select.Limit(10).ToDataTable("id, 111222");
 | 
			
		||||
			var dt3 = select.Limit(10).ToDataTable(a => new { a.Id, a.Type.Name, now = DateTime.Now });
 | 
			
		||||
		}
 | 
			
		||||
		[Fact]
 | 
			
		||||
		public void ToList() {
 | 
			
		||||
		}
 | 
			
		||||
 
 | 
			
		||||
@@ -32,6 +32,21 @@ namespace FreeSql.Tests.SqlServer {
 | 
			
		||||
			public List<TestTypeInfo> Types { get; set; }
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		[Fact]
 | 
			
		||||
		public void ToDataTable() {
 | 
			
		||||
			var items = new List<Topic>();
 | 
			
		||||
			for (var a = 0; a < 10; a++) items.Add(new Topic { Id = a + 1, Title = $"newtitle{a}", Clicks = a * 100, CreateTime = DateTime.Now });
 | 
			
		||||
 | 
			
		||||
			Assert.Single(g.sqlserver.Insert<Topic>().AppendData(items.First()).ExecuteInserted());
 | 
			
		||||
			Assert.Equal(10, g.sqlserver.Insert<Topic>().AppendData(items).ExecuteInserted().Count);
 | 
			
		||||
 | 
			
		||||
			//items = Enumerable.Range(0, 9989).Select(a => new Topic { Title = "newtitle" + a, CreateTime = DateTime.Now }).ToList();
 | 
			
		||||
			//Assert.Equal(9989, g.sqlserver.Insert<Topic>(items).ExecuteAffrows());
 | 
			
		||||
 | 
			
		||||
			var dt1 = select.Limit(10).ToDataTable();
 | 
			
		||||
			var dt2 = select.Limit(10).ToDataTable("id, getdate()");
 | 
			
		||||
			var dt3 = select.Limit(10).ToDataTable(a => new { a.Id, a.Type.Name, now = DateTime.Now });
 | 
			
		||||
		}
 | 
			
		||||
		[Fact]
 | 
			
		||||
		public void ToList() {
 | 
			
		||||
		}
 | 
			
		||||
 
 | 
			
		||||
@@ -59,7 +59,7 @@ namespace FreeSql.Tests.SqlServer {
 | 
			
		||||
				testFieldBoolNullable = true,
 | 
			
		||||
				testFieldByte = byte.MaxValue,
 | 
			
		||||
				testFieldByteNullable = byte.MinValue,
 | 
			
		||||
				testFieldBytes = Encoding.UTF8.GetBytes("<22><><EFBFBD><EFBFBD><EFBFBD>й<EFBFBD><D0B9><EFBFBD>"),
 | 
			
		||||
				testFieldBytes = Encoding.GetEncoding("gb2312").GetBytes("<22><><EFBFBD><EFBFBD><EFBFBD>й<EFBFBD><D0B9><EFBFBD>"),
 | 
			
		||||
				testFieldDateTime = DateTime.Now,
 | 
			
		||||
				testFieldDateTimeNullable = DateTime.Now.AddHours(1),
 | 
			
		||||
				testFieldDateTimeNullableOffset = new DateTimeOffset(DateTime.Now.AddHours(1), TimeSpan.FromHours(8)),
 | 
			
		||||
 
 | 
			
		||||
@@ -73,6 +73,21 @@ namespace FreeSql.Tests.Sqlite {
 | 
			
		||||
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		[Fact]
 | 
			
		||||
		public void ToDataTable() {
 | 
			
		||||
			var items = new List<Topic>();
 | 
			
		||||
			for (var a = 0; a < 10; a++) items.Add(new Topic { Id = a + 1, Title = $"newtitle{a}", Clicks = a * 100, CreateTime = DateTime.Now });
 | 
			
		||||
 | 
			
		||||
			Assert.Equal(1, g.sqlite.Insert<Topic>().AppendData(items.First()).ExecuteAffrows());
 | 
			
		||||
			Assert.Equal(10, g.sqlite.Insert<Topic>().AppendData(items).ExecuteAffrows());
 | 
			
		||||
 | 
			
		||||
			items = Enumerable.Range(0, 9989).Select(a => new Topic { Title = "newtitle" + a, CreateTime = DateTime.Now }).ToList();
 | 
			
		||||
			Assert.Equal(9989, g.sqlite.Insert<Topic>(items).ExecuteAffrows());
 | 
			
		||||
 | 
			
		||||
			var dt1 = select.Limit(10).ToDataTable();
 | 
			
		||||
			var dt2 = select.Limit(10).ToDataTable("id, 111222");
 | 
			
		||||
			var dt3 = select.Limit(10).ToDataTable(a => new { a.Id, a.Type.Name, now = DateTime.Now });
 | 
			
		||||
		}
 | 
			
		||||
		[Fact]
 | 
			
		||||
		public void ToList() {
 | 
			
		||||
		}
 | 
			
		||||
 
 | 
			
		||||
@@ -6,10 +6,9 @@ using System.Text;
 | 
			
		||||
 | 
			
		||||
public class g {
 | 
			
		||||
 | 
			
		||||
	public static IFreeSql mysql = new FreeSql.FreeSqlBuilder()
 | 
			
		||||
	static Lazy<IFreeSql> mysqlLazy = new Lazy<IFreeSql>(() => new FreeSql.FreeSqlBuilder()
 | 
			
		||||
		.UseConnectionString(FreeSql.DataType.MySql, "Data Source=127.0.0.1;Port=3306;User ID=root;Password=root;Initial Catalog=cccddd;Charset=utf8;SslMode=none;Max pool size=10")
 | 
			
		||||
		.UseAutoSyncStructure(true)
 | 
			
		||||
 | 
			
		||||
		.UseMonitorCommand(
 | 
			
		||||
			cmd => {
 | 
			
		||||
				Trace.WriteLine(cmd.CommandText);
 | 
			
		||||
@@ -18,31 +17,36 @@ public class g {
 | 
			
		||||
				Console.WriteLine(traceLog);
 | 
			
		||||
			}) //监听SQL命令对象,在执行后
 | 
			
		||||
		.UseLazyLoading(true)
 | 
			
		||||
		.Build();
 | 
			
		||||
		.Build());
 | 
			
		||||
	public static IFreeSql mysql => mysqlLazy.Value;
 | 
			
		||||
 | 
			
		||||
	public static IFreeSql sqlserver = new FreeSql.FreeSqlBuilder()
 | 
			
		||||
	static Lazy<IFreeSql> sqlserverLazy = new Lazy<IFreeSql>(() => new FreeSql.FreeSqlBuilder()
 | 
			
		||||
		.UseConnectionString(FreeSql.DataType.SqlServer, "Data Source=.;Integrated Security=True;Initial Catalog=cms;Pooling=true;Max Pool Size=10")
 | 
			
		||||
		.UseAutoSyncStructure(true)
 | 
			
		||||
		.UseLazyLoading(true)
 | 
			
		||||
		.Build();
 | 
			
		||||
		.Build());
 | 
			
		||||
	public static IFreeSql sqlserver => sqlserverLazy.Value;
 | 
			
		||||
 | 
			
		||||
	public static IFreeSql pgsql = new FreeSql.FreeSqlBuilder()
 | 
			
		||||
	static Lazy<IFreeSql> pgsqlLazy = new Lazy<IFreeSql>(() => new FreeSql.FreeSqlBuilder()
 | 
			
		||||
		.UseConnectionString(FreeSql.DataType.PostgreSQL, "Host=192.168.164.10;Port=5432;Username=postgres;Password=123456;Database=tedb;Pooling=true;Maximum Pool Size=10")
 | 
			
		||||
		.UseAutoSyncStructure(true)
 | 
			
		||||
		.UseSyncStructureToLower(true)
 | 
			
		||||
		.UseLazyLoading(true)
 | 
			
		||||
		.Build();
 | 
			
		||||
		.Build());
 | 
			
		||||
	public static IFreeSql pgsql => pgsqlLazy.Value;
 | 
			
		||||
 | 
			
		||||
	public static IFreeSql oracle = new FreeSql.FreeSqlBuilder()
 | 
			
		||||
	static Lazy<IFreeSql> oracleLazy = new Lazy<IFreeSql>(() => new FreeSql.FreeSqlBuilder()
 | 
			
		||||
		.UseConnectionString(FreeSql.DataType.Oracle, "user id=user1;password=123456;data source=//127.0.0.1:1521/XE;Pooling=true;Max Pool Size=10")
 | 
			
		||||
		.UseAutoSyncStructure(true)
 | 
			
		||||
		.UseLazyLoading(true)
 | 
			
		||||
		.UseSyncStructureToUpper(true)
 | 
			
		||||
		.Build();
 | 
			
		||||
		.Build());
 | 
			
		||||
	public static IFreeSql oracle = oracleLazy.Value;
 | 
			
		||||
 | 
			
		||||
	public static IFreeSql sqlite = new FreeSql.FreeSqlBuilder()
 | 
			
		||||
	static Lazy<IFreeSql> sqliteLazy = new Lazy<IFreeSql>(() => new FreeSql.FreeSqlBuilder()
 | 
			
		||||
		.UseConnectionString(FreeSql.DataType.Sqlite, @"Data Source=|DataDirectory|\document.db;Attachs=xxxtb.db;Pooling=true;Max Pool Size=10")
 | 
			
		||||
		.UseAutoSyncStructure(true)
 | 
			
		||||
		.UseLazyLoading(true)
 | 
			
		||||
		.Build();
 | 
			
		||||
		.Build());
 | 
			
		||||
	public static IFreeSql sqlite = sqliteLazy.Value;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,4 @@
 | 
			
		||||
using System;
 | 
			
		||||
 | 
			
		||||
namespace FreeSql.DataAnnotations {
 | 
			
		||||
namespace FreeSql.DataAnnotations {
 | 
			
		||||
	public class ColumnFluent {
 | 
			
		||||
 | 
			
		||||
		public ColumnFluent(ColumnAttribute column) {
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,5 @@
 | 
			
		||||
using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.Collections.Concurrent;
 | 
			
		||||
using System.Linq;
 | 
			
		||||
using System.Linq.Expressions;
 | 
			
		||||
using System.Reflection;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,4 @@
 | 
			
		||||
using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.Text;
 | 
			
		||||
 | 
			
		||||
namespace FreeSql.DatabaseModel {
 | 
			
		||||
	public class DbColumnInfo {
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,4 @@
 | 
			
		||||
using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.Text;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
 | 
			
		||||
namespace FreeSql.DatabaseModel {
 | 
			
		||||
	public class DbTableInfo {
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,4 @@
 | 
			
		||||
using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.Text;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
 | 
			
		||||
namespace FreeSql.DatabaseModel {
 | 
			
		||||
	public class DbEnumInfo {
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,4 @@
 | 
			
		||||
using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.Text;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
 | 
			
		||||
namespace FreeSql.DatabaseModel {
 | 
			
		||||
	public class DbForeignInfo {
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,4 @@
 | 
			
		||||
using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.Text;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
 | 
			
		||||
namespace FreeSql.DatabaseModel {
 | 
			
		||||
	public class DbTypeInfo {
 | 
			
		||||
 
 | 
			
		||||
@@ -2,6 +2,7 @@
 | 
			
		||||
using System;
 | 
			
		||||
using System.Collections;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.Collections.Concurrent;
 | 
			
		||||
using System.ComponentModel;
 | 
			
		||||
using System.Data;
 | 
			
		||||
using System.Drawing;
 | 
			
		||||
@@ -43,10 +44,12 @@ public static class FreeSqlGlobalExtensions {
 | 
			
		||||
		return 2 * Math.Asin(Math.Sqrt(Math.Pow(Math.Sin((radLat1 - radLat2) / 2), 2) + Math.Cos(radLat1) * Math.Cos(radLat2) * Math.Pow(Math.Sin((radLng1 - radLng2) / 2), 2))) * 6378137;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	static ConcurrentDictionary<Type, FieldInfo[]> _dicGetFields = new ConcurrentDictionary<Type, FieldInfo[]>();
 | 
			
		||||
	public static object GetEnum<T>(this IDataReader dr, int index) {
 | 
			
		||||
		string value = dr.GetString(index);
 | 
			
		||||
		Type t = typeof(T);
 | 
			
		||||
		foreach (var f in t.GetFields())
 | 
			
		||||
		var value = dr.GetString(index);
 | 
			
		||||
		var t = typeof(T);
 | 
			
		||||
		var fs = _dicGetFields.GetOrAdd(t, t2 => t2.GetFields());
 | 
			
		||||
		foreach (var f in fs)
 | 
			
		||||
			if (f.GetCustomAttribute<DescriptionAttribute>()?.Description == value || f.Name == value) return Enum.Parse(t, f.Name, true);
 | 
			
		||||
		return null;
 | 
			
		||||
	}
 | 
			
		||||
@@ -60,10 +63,11 @@ public static class FreeSqlGlobalExtensions {
 | 
			
		||||
		return Convert.ToInt64(item);
 | 
			
		||||
	}
 | 
			
		||||
	public static IEnumerable<T> ToSet<T>(this long value) {
 | 
			
		||||
		List<T> ret = new List<T>();
 | 
			
		||||
		var ret = new List<T>();
 | 
			
		||||
		if (value == 0) return ret;
 | 
			
		||||
		Type t = typeof(T);
 | 
			
		||||
		foreach (FieldInfo f in t.GetFields()) {
 | 
			
		||||
		var t = typeof(T);
 | 
			
		||||
		var fs = _dicGetFields.GetOrAdd(t, t2 => t2.GetFields());
 | 
			
		||||
		foreach (var f in fs) {
 | 
			
		||||
			if (f.FieldType != t) continue;
 | 
			
		||||
			object o = Enum.Parse(t, f.Name, true);
 | 
			
		||||
			long v = (long)o;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,6 @@
 | 
			
		||||
using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.Data;
 | 
			
		||||
using System.Data.Common;
 | 
			
		||||
using System.Linq.Expressions;
 | 
			
		||||
using System.Text;
 | 
			
		||||
@@ -15,6 +16,13 @@ namespace FreeSql {
 | 
			
		||||
		/// <returns></returns>
 | 
			
		||||
		TSelect WithTransaction(DbTransaction transaction);
 | 
			
		||||
 | 
			
		||||
		/// <summary>
 | 
			
		||||
		/// 执行SQL查询,返回 DataTable
 | 
			
		||||
		/// </summary>
 | 
			
		||||
		/// <returns></returns>
 | 
			
		||||
		DataTable ToDataTable(string field = null);
 | 
			
		||||
		Task<DataTable> ToDataTableAsync(string field = null);
 | 
			
		||||
 | 
			
		||||
		/// <summary>
 | 
			
		||||
		/// 执行SQL查询,返回 T1 实体所有字段的记录,记录不存在时返回 Count 为 0 的列表
 | 
			
		||||
		/// </summary>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,6 @@
 | 
			
		||||
using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.Data;
 | 
			
		||||
using System.Linq.Expressions;
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
 | 
			
		||||
@@ -14,6 +15,13 @@ namespace FreeSql {
 | 
			
		||||
		bool Any(Expression<Func<T1, bool>> exp);
 | 
			
		||||
		Task<bool> AnyAsync(Expression<Func<T1, bool>> exp);
 | 
			
		||||
 | 
			
		||||
		/// <summary>
 | 
			
		||||
		/// 执行SQL查询,返回 DataTable
 | 
			
		||||
		/// </summary>
 | 
			
		||||
		/// <returns></returns>
 | 
			
		||||
		DataTable ToDataTable<TReturn>(Expression<Func<T1, TReturn>> select);
 | 
			
		||||
		Task<DataTable> ToDataTableAsync<TReturn>(Expression<Func<T1, TReturn>> select);
 | 
			
		||||
 | 
			
		||||
		/// <summary>
 | 
			
		||||
		/// 执行SQL查询,返回指定字段的记录,记录不存在时返回 Count 为 0 的列表
 | 
			
		||||
		/// </summary>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,6 @@
 | 
			
		||||
using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.Data;
 | 
			
		||||
using System.Linq.Expressions;
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
 | 
			
		||||
@@ -9,6 +10,9 @@ namespace FreeSql {
 | 
			
		||||
		bool Any(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, bool>> exp);
 | 
			
		||||
		Task<bool> AnyAsync(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, bool>> exp);
 | 
			
		||||
 | 
			
		||||
		DataTable ToDataTable<TReturn>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, TReturn>> select);
 | 
			
		||||
		Task<DataTable> ToDataTableAsync<TReturn>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, TReturn>> select);
 | 
			
		||||
 | 
			
		||||
		List<TReturn> ToList<TReturn>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, TReturn>> select);
 | 
			
		||||
		Task<List<TReturn>> ToListAsync<TReturn>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, TReturn>> select);
 | 
			
		||||
		string ToSql<TReturn>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, TReturn>> select);
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,6 @@
 | 
			
		||||
using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.Data;
 | 
			
		||||
using System.Linq.Expressions;
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
 | 
			
		||||
@@ -9,6 +10,9 @@ namespace FreeSql {
 | 
			
		||||
		bool Any(Expression<Func<T1, T2, T3, bool>> exp);
 | 
			
		||||
		Task<bool> AnyAsync(Expression<Func<T1, T2, T3, bool>> exp);
 | 
			
		||||
 | 
			
		||||
		DataTable ToDataTable<TReturn>(Expression<Func<T1, T2, T3, TReturn>> select);
 | 
			
		||||
		Task<DataTable> ToDataTableAsync<TReturn>(Expression<Func<T1, T2, T3, TReturn>> select);
 | 
			
		||||
 | 
			
		||||
		List<TReturn> ToList<TReturn>(Expression<Func<T1, T2, T3, TReturn>> select);
 | 
			
		||||
		Task<List<TReturn>> ToListAsync<TReturn>(Expression<Func<T1, T2, T3, TReturn>> select);
 | 
			
		||||
		string ToSql<TReturn>(Expression<Func<T1, T2, T3, TReturn>> select);
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,6 @@
 | 
			
		||||
using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.Data;
 | 
			
		||||
using System.Linq.Expressions;
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
 | 
			
		||||
@@ -9,6 +10,9 @@ namespace FreeSql {
 | 
			
		||||
		bool Any(Expression<Func<T1, T2, T3, T4, bool>> exp);
 | 
			
		||||
		Task<bool> AnyAsync(Expression<Func<T1, T2, T3, T4, bool>> exp);
 | 
			
		||||
 | 
			
		||||
		DataTable ToDataTable<TReturn>(Expression<Func<T1, T2, T3, T4, TReturn>> select);
 | 
			
		||||
		Task<DataTable> ToDataTableAsync<TReturn>(Expression<Func<T1, T2, T3, T4, TReturn>> select);
 | 
			
		||||
 | 
			
		||||
		List<TReturn> ToList<TReturn>(Expression<Func<T1, T2, T3, T4, TReturn>> select);
 | 
			
		||||
		Task<List<TReturn>> ToListAsync<TReturn>(Expression<Func<T1, T2, T3, T4, TReturn>> select);
 | 
			
		||||
		string ToSql<TReturn>(Expression<Func<T1, T2, T3, T4, TReturn>> select);
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,6 @@
 | 
			
		||||
using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.Data;
 | 
			
		||||
using System.Linq.Expressions;
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
 | 
			
		||||
@@ -9,6 +10,9 @@ namespace FreeSql {
 | 
			
		||||
		bool Any(Expression<Func<T1, T2, T3, T4, T5, bool>> exp);
 | 
			
		||||
		Task<bool> AnyAsync(Expression<Func<T1, T2, T3, T4, T5, bool>> exp);
 | 
			
		||||
 | 
			
		||||
		DataTable ToDataTable<TReturn>(Expression<Func<T1, T2, T3, T4, T5, TReturn>> select);
 | 
			
		||||
		Task<DataTable> ToDataTableAsync<TReturn>(Expression<Func<T1, T2, T3, T4, T5, TReturn>> select);
 | 
			
		||||
 | 
			
		||||
		List<TReturn> ToList<TReturn>(Expression<Func<T1, T2, T3, T4, T5, TReturn>> select);
 | 
			
		||||
		Task<List<TReturn>> ToListAsync<TReturn>(Expression<Func<T1, T2, T3, T4, T5, TReturn>> select);
 | 
			
		||||
		string ToSql<TReturn>(Expression<Func<T1, T2, T3, T4, T5, TReturn>> select);
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,6 @@
 | 
			
		||||
using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.Data;
 | 
			
		||||
using System.Linq.Expressions;
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
 | 
			
		||||
@@ -9,6 +10,9 @@ namespace FreeSql {
 | 
			
		||||
		bool Any(Expression<Func<T1, T2, T3, T4, T5, T6, bool>> exp);
 | 
			
		||||
		Task<bool> AnyAsync(Expression<Func<T1, T2, T3, T4, T5, T6, bool>> exp);
 | 
			
		||||
 | 
			
		||||
		DataTable ToDataTable<TReturn>(Expression<Func<T1, T2, T3, T4, T5, T6, TReturn>> select);
 | 
			
		||||
		Task<DataTable> ToDataTableAsync<TReturn>(Expression<Func<T1, T2, T3, T4, T5, T6, TReturn>> select);
 | 
			
		||||
 | 
			
		||||
		List<TReturn> ToList<TReturn>(Expression<Func<T1, T2, T3, T4, T5, T6, TReturn>> select);
 | 
			
		||||
		Task<List<TReturn>> ToListAsync<TReturn>(Expression<Func<T1, T2, T3, T4, T5, T6, TReturn>> select);
 | 
			
		||||
		string ToSql<TReturn>(Expression<Func<T1, T2, T3, T4, T5, T6, TReturn>> select);
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,6 @@
 | 
			
		||||
using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.Data;
 | 
			
		||||
using System.Linq.Expressions;
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
 | 
			
		||||
@@ -9,6 +10,9 @@ namespace FreeSql {
 | 
			
		||||
		bool Any(Expression<Func<T1, T2, T3, T4, T5, T6, T7, bool>> exp);
 | 
			
		||||
		Task<bool> AnyAsync(Expression<Func<T1, T2, T3, T4, T5, T6, T7, bool>> exp);
 | 
			
		||||
 | 
			
		||||
		DataTable ToDataTable<TReturn>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, TReturn>> select);
 | 
			
		||||
		Task<DataTable> ToDataTableAsync<TReturn>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, TReturn>> select);
 | 
			
		||||
 | 
			
		||||
		List<TReturn> ToList<TReturn>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, TReturn>> select);
 | 
			
		||||
		Task<List<TReturn>> ToListAsync<TReturn>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, TReturn>> select);
 | 
			
		||||
		string ToSql<TReturn>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, TReturn>> select);
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,6 @@
 | 
			
		||||
using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.Data;
 | 
			
		||||
using System.Linq.Expressions;
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
 | 
			
		||||
@@ -9,6 +10,9 @@ namespace FreeSql {
 | 
			
		||||
		bool Any(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, bool>> exp);
 | 
			
		||||
		Task<bool> AnyAsync(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, bool>> exp);
 | 
			
		||||
 | 
			
		||||
		DataTable ToDataTable<TReturn>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, TReturn>> select);
 | 
			
		||||
		Task<DataTable> ToDataTableAsync<TReturn>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, TReturn>> select);
 | 
			
		||||
 | 
			
		||||
		List<TReturn> ToList<TReturn>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, TReturn>> select);
 | 
			
		||||
		Task<List<TReturn>> ToListAsync<TReturn>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, TReturn>> select);
 | 
			
		||||
		string ToSql<TReturn>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, TReturn>> select);
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,6 @@
 | 
			
		||||
using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.Data;
 | 
			
		||||
using System.Linq.Expressions;
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
 | 
			
		||||
@@ -9,6 +10,9 @@ namespace FreeSql {
 | 
			
		||||
		bool Any(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, bool>> exp);
 | 
			
		||||
		Task<bool> AnyAsync(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, bool>> exp);
 | 
			
		||||
 | 
			
		||||
		DataTable ToDataTable<TReturn>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, TReturn>> select);
 | 
			
		||||
		Task<DataTable> ToDataTableAsync<TReturn>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, TReturn>> select);
 | 
			
		||||
 | 
			
		||||
		List<TReturn> ToList<TReturn>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, TReturn>> select);
 | 
			
		||||
		Task<List<TReturn>> ToListAsync<TReturn>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, TReturn>> select);
 | 
			
		||||
		string ToSql<TReturn>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, TReturn>> select);
 | 
			
		||||
 
 | 
			
		||||
@@ -81,7 +81,9 @@ namespace FreeSql.Internal.CommonProvider {
 | 
			
		||||
					++colidx;
 | 
			
		||||
				}
 | 
			
		||||
			sb.Append(") VALUES");
 | 
			
		||||
			_params = new DbParameter[colidx * _source.Count];
 | 
			
		||||
			//_params = new DbParameter[colidx * _source.Count];
 | 
			
		||||
			_params = new DbParameter[0];
 | 
			
		||||
			//_params = new DbParameter[colidx * 5]; //批量添加第5行起,不使用参数化
 | 
			
		||||
			var didx = 0;
 | 
			
		||||
			foreach (var d in _source) {
 | 
			
		||||
				if (didx > 0) sb.Append(", ");
 | 
			
		||||
@@ -90,14 +92,18 @@ namespace FreeSql.Internal.CommonProvider {
 | 
			
		||||
				foreach (var col in _table.Columns.Values)
 | 
			
		||||
					if (col.Attribute.IsIdentity == false && _ignore.ContainsKey(col.Attribute.Name) == false) {
 | 
			
		||||
						if (colidx2 > 0) sb.Append(", ");
 | 
			
		||||
						sb.Append(_commonUtils.QuoteWriteParamter(col.CsType, $"{_commonUtils.QuoteParamterName(col.CsName)}{didx}"));
 | 
			
		||||
						object val = null;
 | 
			
		||||
						if (_table.Properties.TryGetValue(col.CsName, out var tryp)) {
 | 
			
		||||
							val = tryp.GetValue(d);
 | 
			
		||||
							if (col.Attribute.IsPrimary && (col.CsType == typeof(Guid) || col.CsType == typeof(Guid?))
 | 
			
		||||
								&& (val == null || (Guid)val == Guid.Empty)) tryp.SetValue(d, val = FreeUtil.NewMongodbId());
 | 
			
		||||
						}
 | 
			
		||||
						_params[didx * colidx + colidx2] = _commonUtils.AppendParamter(null, $"{col.CsName}{didx}", col.CsType, val);
 | 
			
		||||
						//if (didx >= 5)
 | 
			
		||||
							sb.Append(_commonUtils.GetNoneParamaterSqlValue(col.CsType, val));
 | 
			
		||||
						//else {
 | 
			
		||||
						//	sb.Append(_commonUtils.QuoteWriteParamter(col.CsType, $"{_commonUtils.QuoteParamterName(col.CsName)}{didx}"));
 | 
			
		||||
						//	_params[didx * colidx + colidx2] = _commonUtils.AppendParamter(null, $"{col.CsName}{didx}", col.CsType, val);
 | 
			
		||||
						//}
 | 
			
		||||
						++colidx2;
 | 
			
		||||
					}
 | 
			
		||||
				sb.Append(")");
 | 
			
		||||
 
 | 
			
		||||
@@ -152,6 +152,21 @@ namespace FreeSql.Internal.CommonProvider {
 | 
			
		||||
		}
 | 
			
		||||
		public TSelect Take(int limit) => this.Limit(limit) as TSelect;
 | 
			
		||||
 | 
			
		||||
		public DataTable ToDataTable(string field = null) {
 | 
			
		||||
			var sql = this.ToSql(field);
 | 
			
		||||
			if (_cache.seconds > 0 && string.IsNullOrEmpty(_cache.key)) _cache.key = sql;
 | 
			
		||||
 | 
			
		||||
			return _orm.Cache.Shell(_cache.key, _cache.seconds, () =>
 | 
			
		||||
				_orm.Ado.ExecuteDataTable(_transaction, CommandType.Text, sql, _params.ToArray()));
 | 
			
		||||
		}
 | 
			
		||||
		public Task<DataTable> ToDataTableAsync(string field = null) {
 | 
			
		||||
			var sql = this.ToSql(field);
 | 
			
		||||
			if (_cache.seconds > 0 && string.IsNullOrEmpty(_cache.key)) _cache.key = sql;
 | 
			
		||||
 | 
			
		||||
			return _orm.Cache.ShellAsync(_cache.key, _cache.seconds, () =>
 | 
			
		||||
				_orm.Ado.ExecuteDataTableAsync(_transaction, CommandType.Text, sql, _params.ToArray()));
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		public List<TTuple> ToList<TTuple>(string field) {
 | 
			
		||||
			var sql = this.ToSql(field);
 | 
			
		||||
			if (_cache.seconds > 0 && string.IsNullOrEmpty(_cache.key)) _cache.key = sql;
 | 
			
		||||
@@ -472,6 +487,9 @@ namespace FreeSql.Internal.CommonProvider {
 | 
			
		||||
			return this.ToSql(af.field);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		protected DataTable InternalToDataTable(Expression select) => _orm.Ado.ExecuteDataTable(_transaction, CommandType.Text, this.InternalToSql<int>(select), _params.ToArray());
 | 
			
		||||
		protected Task<DataTable> InternalToDataTableAsync(Expression select) => _orm.Ado.ExecuteDataTableAsync(_transaction, CommandType.Text, this.InternalToSql<int>(select), _params.ToArray());
 | 
			
		||||
 | 
			
		||||
		protected TReturn InternalToAggregate<TReturn>(Expression select) {
 | 
			
		||||
			var map = new ReadAnonymousTypeInfo();
 | 
			
		||||
			var field = new StringBuilder();
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,6 @@
 | 
			
		||||
using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.Data;
 | 
			
		||||
using System.Linq.Expressions;
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
 | 
			
		||||
@@ -51,6 +52,10 @@ namespace FreeSql.Internal.CommonProvider {
 | 
			
		||||
 | 
			
		||||
		Task<List<TReturn>> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>.ToListAsync<TReturn>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, TReturn>> select) => this.InternalToListAsync<TReturn>(select?.Body);
 | 
			
		||||
 | 
			
		||||
		DataTable ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>.ToDataTable<TReturn>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, TReturn>> select) => this.InternalToDataTable(select?.Body);
 | 
			
		||||
 | 
			
		||||
		Task<DataTable> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>.ToDataTableAsync<TReturn>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, TReturn>> select) => this.InternalToDataTableAsync(select?.Body);
 | 
			
		||||
 | 
			
		||||
		string ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>.ToSql<TReturn>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, TReturn>> select) => this.InternalToSql<TReturn>(select?.Body);
 | 
			
		||||
 | 
			
		||||
		ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>.Where(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, bool>> exp) => this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null));
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,7 @@
 | 
			
		||||
using FreeSql.Internal.Model;
 | 
			
		||||
using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.Data;
 | 
			
		||||
using System.Linq;
 | 
			
		||||
using System.Linq.Expressions;
 | 
			
		||||
using System.Text;
 | 
			
		||||
@@ -99,6 +100,10 @@ namespace FreeSql.Internal.CommonProvider {
 | 
			
		||||
 | 
			
		||||
		public Task<List<TReturn>> ToListAsync<TReturn>(Expression<Func<T1, TReturn>> select) => this.InternalToListAsync<TReturn>(select?.Body);
 | 
			
		||||
 | 
			
		||||
		public DataTable ToDataTable<TReturn>(Expression<Func<T1, TReturn>> select) => this.InternalToDataTable(select?.Body);
 | 
			
		||||
 | 
			
		||||
		public Task<DataTable> ToDataTableAsync<TReturn>(Expression<Func<T1, TReturn>> select) => this.InternalToDataTableAsync(select?.Body);
 | 
			
		||||
 | 
			
		||||
		public string ToSql<TReturn>(Expression<Func<T1, TReturn>> select) => this.InternalToSql<TReturn>(select?.Body);
 | 
			
		||||
 | 
			
		||||
		public TReturn ToAggregate<TReturn>(Expression<Func<ISelectGroupingAggregate<T1>, TReturn>> select) => this.InternalToAggregate<TReturn>(select?.Body);
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,6 @@
 | 
			
		||||
using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.Data;
 | 
			
		||||
using System.Linq.Expressions;
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
 | 
			
		||||
@@ -44,6 +45,10 @@ namespace FreeSql.Internal.CommonProvider {
 | 
			
		||||
 | 
			
		||||
		Task<List<TReturn>> ISelect<T1, T2, T3>.ToListAsync<TReturn>(Expression<Func<T1, T2, T3, TReturn>> select) => this.InternalToListAsync<TReturn>(select?.Body);
 | 
			
		||||
 | 
			
		||||
		DataTable ISelect<T1, T2, T3>.ToDataTable<TReturn>(Expression<Func<T1, T2, T3, TReturn>> select) => this.InternalToDataTable(select?.Body);
 | 
			
		||||
 | 
			
		||||
		Task<DataTable> ISelect<T1, T2, T3>.ToDataTableAsync<TReturn>(Expression<Func<T1, T2, T3, TReturn>> select) => this.InternalToDataTableAsync(select?.Body);
 | 
			
		||||
 | 
			
		||||
		string ISelect<T1, T2, T3>.ToSql<TReturn>(Expression<Func<T1, T2, T3, TReturn>> select) => this.InternalToSql<TReturn>(select?.Body);
 | 
			
		||||
 | 
			
		||||
		ISelect<T1, T2, T3> ISelect<T1, T2, T3>.Where(Expression<Func<T1, T2, T3, bool>> exp) => this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null));
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,6 @@
 | 
			
		||||
using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.Data;
 | 
			
		||||
using System.Linq.Expressions;
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
 | 
			
		||||
@@ -45,6 +46,10 @@ namespace FreeSql.Internal.CommonProvider {
 | 
			
		||||
 | 
			
		||||
		Task<List<TReturn>> ISelect<T1, T2, T3, T4>.ToListAsync<TReturn>(Expression<Func<T1, T2, T3, T4, TReturn>> select) => this.InternalToListAsync<TReturn>(select?.Body);
 | 
			
		||||
 | 
			
		||||
		DataTable ISelect<T1, T2, T3, T4>.ToDataTable<TReturn>(Expression<Func<T1, T2, T3, T4, TReturn>> select) => this.InternalToDataTable(select?.Body);
 | 
			
		||||
 | 
			
		||||
		Task<DataTable> ISelect<T1, T2, T3, T4>.ToDataTableAsync<TReturn>(Expression<Func<T1, T2, T3, T4, TReturn>> select) => this.InternalToDataTableAsync(select?.Body);
 | 
			
		||||
 | 
			
		||||
		string ISelect<T1, T2, T3, T4>.ToSql<TReturn>(Expression<Func<T1, T2, T3, T4, TReturn>> select) => this.InternalToSql<TReturn>(select?.Body);
 | 
			
		||||
 | 
			
		||||
		ISelect<T1, T2, T3, T4> ISelect<T1, T2, T3, T4>.Where(Expression<Func<T1, T2, T3, T4, bool>> exp) => this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null));
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,6 @@
 | 
			
		||||
using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.Data;
 | 
			
		||||
using System.Linq.Expressions;
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
 | 
			
		||||
@@ -46,6 +47,10 @@ namespace FreeSql.Internal.CommonProvider {
 | 
			
		||||
 | 
			
		||||
		Task<List<TReturn>> ISelect<T1, T2, T3, T4, T5>.ToListAsync<TReturn>(Expression<Func<T1, T2, T3, T4, T5, TReturn>> select) => this.InternalToListAsync<TReturn>(select?.Body);
 | 
			
		||||
 | 
			
		||||
		DataTable ISelect<T1, T2, T3, T4, T5>.ToDataTable<TReturn>(Expression<Func<T1, T2, T3, T4, T5, TReturn>> select) => this.InternalToDataTable(select?.Body);
 | 
			
		||||
 | 
			
		||||
		Task<DataTable> ISelect<T1, T2, T3, T4, T5>.ToDataTableAsync<TReturn>(Expression<Func<T1, T2, T3, T4, T5, TReturn>> select) => this.InternalToDataTableAsync(select?.Body);
 | 
			
		||||
 | 
			
		||||
		string ISelect<T1, T2, T3, T4, T5>.ToSql<TReturn>(Expression<Func<T1, T2, T3, T4, T5, TReturn>> select) => this.InternalToSql<TReturn>(select?.Body);
 | 
			
		||||
 | 
			
		||||
		ISelect<T1, T2, T3, T4, T5> ISelect<T1, T2, T3, T4, T5>.Where(Expression<Func<T1, T2, T3, T4, T5, bool>> exp) => this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null));
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,6 @@
 | 
			
		||||
using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.Data;
 | 
			
		||||
using System.Linq.Expressions;
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
 | 
			
		||||
@@ -47,6 +48,10 @@ namespace FreeSql.Internal.CommonProvider {
 | 
			
		||||
 | 
			
		||||
		Task<List<TReturn>> ISelect<T1, T2, T3, T4, T5, T6>.ToListAsync<TReturn>(Expression<Func<T1, T2, T3, T4, T5, T6, TReturn>> select) => this.InternalToListAsync<TReturn>(select?.Body);
 | 
			
		||||
 | 
			
		||||
		DataTable ISelect<T1, T2, T3, T4, T5, T6>.ToDataTable<TReturn>(Expression<Func<T1, T2, T3, T4, T5, T6, TReturn>> select) => this.InternalToDataTable(select?.Body);
 | 
			
		||||
 | 
			
		||||
		Task<DataTable> ISelect<T1, T2, T3, T4, T5, T6>.ToDataTableAsync<TReturn>(Expression<Func<T1, T2, T3, T4, T5, T6, TReturn>> select) => this.InternalToDataTableAsync(select?.Body);
 | 
			
		||||
 | 
			
		||||
		string ISelect<T1, T2, T3, T4, T5, T6>.ToSql<TReturn>(Expression<Func<T1, T2, T3, T4, T5, T6, TReturn>> select) => this.InternalToSql<TReturn>(select?.Body);
 | 
			
		||||
 | 
			
		||||
		ISelect<T1, T2, T3, T4, T5, T6> ISelect<T1, T2, T3, T4, T5, T6>.Where(Expression<Func<T1, T2, T3, T4, T5, T6, bool>> exp) => this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null));
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,6 @@
 | 
			
		||||
using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.Data;
 | 
			
		||||
using System.Linq.Expressions;
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
 | 
			
		||||
@@ -48,6 +49,10 @@ namespace FreeSql.Internal.CommonProvider {
 | 
			
		||||
 | 
			
		||||
		Task<List<TReturn>> ISelect<T1, T2, T3, T4, T5, T6, T7>.ToListAsync<TReturn>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, TReturn>> select) => this.InternalToListAsync<TReturn>(select?.Body);
 | 
			
		||||
 | 
			
		||||
		DataTable ISelect<T1, T2, T3, T4, T5, T6, T7>.ToDataTable<TReturn>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, TReturn>> select) => this.InternalToDataTable(select?.Body);
 | 
			
		||||
 | 
			
		||||
		Task<DataTable> ISelect<T1, T2, T3, T4, T5, T6, T7>.ToDataTableAsync<TReturn>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, TReturn>> select) => this.InternalToDataTableAsync(select?.Body);
 | 
			
		||||
 | 
			
		||||
		string ISelect<T1, T2, T3, T4, T5, T6, T7>.ToSql<TReturn>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, TReturn>> select) => this.InternalToSql<TReturn>(select?.Body);
 | 
			
		||||
 | 
			
		||||
		ISelect<T1, T2, T3, T4, T5, T6, T7> ISelect<T1, T2, T3, T4, T5, T6, T7>.Where(Expression<Func<T1, T2, T3, T4, T5, T6, T7, bool>> exp) => this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null));
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,6 @@
 | 
			
		||||
using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.Data;
 | 
			
		||||
using System.Linq.Expressions;
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
 | 
			
		||||
@@ -49,6 +50,10 @@ namespace FreeSql.Internal.CommonProvider {
 | 
			
		||||
 | 
			
		||||
		Task<List<TReturn>> ISelect<T1, T2, T3, T4, T5, T6, T7, T8>.ToListAsync<TReturn>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, TReturn>> select) => this.InternalToListAsync<TReturn>(select?.Body);
 | 
			
		||||
 | 
			
		||||
		DataTable ISelect<T1, T2, T3, T4, T5, T6, T7, T8>.ToDataTable<TReturn>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, TReturn>> select) => this.InternalToDataTable(select?.Body);
 | 
			
		||||
 | 
			
		||||
		Task<DataTable> ISelect<T1, T2, T3, T4, T5, T6, T7, T8>.ToDataTableAsync<TReturn>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, TReturn>> select) => this.InternalToDataTableAsync(select?.Body);
 | 
			
		||||
 | 
			
		||||
		string ISelect<T1, T2, T3, T4, T5, T6, T7, T8>.ToSql<TReturn>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, TReturn>> select) => this.InternalToSql<TReturn>(select?.Body);
 | 
			
		||||
 | 
			
		||||
		ISelect<T1, T2, T3, T4, T5, T6, T7, T8> ISelect<T1, T2, T3, T4, T5, T6, T7, T8>.Where(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, bool>> exp) => this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null));
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,6 @@
 | 
			
		||||
using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.Data;
 | 
			
		||||
using System.Linq.Expressions;
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
 | 
			
		||||
@@ -50,6 +51,10 @@ namespace FreeSql.Internal.CommonProvider {
 | 
			
		||||
 | 
			
		||||
		Task<List<TReturn>> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9>.ToListAsync<TReturn>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, TReturn>> select) => this.InternalToListAsync<TReturn>(select?.Body);
 | 
			
		||||
 | 
			
		||||
		DataTable ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9>.ToDataTable<TReturn>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, TReturn>> select) => this.InternalToDataTable(select?.Body);
 | 
			
		||||
 | 
			
		||||
		Task<DataTable> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9>.ToDataTableAsync<TReturn>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, TReturn>> select) => this.InternalToDataTableAsync(select?.Body);
 | 
			
		||||
 | 
			
		||||
		string ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9>.ToSql<TReturn>(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, TReturn>> select) => this.InternalToSql<TReturn>(select?.Body);
 | 
			
		||||
 | 
			
		||||
		ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9>.Where(Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, bool>> exp) => this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null));
 | 
			
		||||
 
 | 
			
		||||
@@ -13,6 +13,7 @@ using System.Text;
 | 
			
		||||
namespace FreeSql.Internal {
 | 
			
		||||
	internal abstract class CommonUtils {
 | 
			
		||||
 | 
			
		||||
		internal abstract string GetNoneParamaterSqlValue(Type type, object value);
 | 
			
		||||
		internal abstract DbParameter[] GetDbParamtersByObject(string sql, object obj);
 | 
			
		||||
		internal abstract DbParameter AppendParamter(List<DbParameter> _params, string parameterName, Type type, object value);
 | 
			
		||||
		internal abstract string FormatSql(string sql, params object[] args);
 | 
			
		||||
 
 | 
			
		||||
@@ -31,19 +31,15 @@ namespace FreeSql.MySql {
 | 
			
		||||
			else if (param is string)
 | 
			
		||||
				return string.Concat("'", param.ToString().Replace("'", "''"), "'");
 | 
			
		||||
			else if (param is Enum)
 | 
			
		||||
				return ((Enum)param).ToInt64();
 | 
			
		||||
				return string.Concat("'", param.ToString().Replace("'", "''"), "'"); //((Enum)param).ToInt64();
 | 
			
		||||
			else if (decimal.TryParse(string.Concat(param), out var trydec))
 | 
			
		||||
				return param;
 | 
			
		||||
			else if (param is DateTime)
 | 
			
		||||
			else if (param is DateTime || param is DateTime?)
 | 
			
		||||
				return string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss"), "'");
 | 
			
		||||
			else if (param is DateTime?)
 | 
			
		||||
				return string.Concat("'", (param as DateTime?).Value.ToString("yyyy-MM-dd HH:mm:ss"), "'");
 | 
			
		||||
			else if (param is TimeSpan)
 | 
			
		||||
			else if (param is TimeSpan || param is TimeSpan?)
 | 
			
		||||
				return ((TimeSpan)param).Ticks / 10;
 | 
			
		||||
			else if (param is TimeSpan?)
 | 
			
		||||
				return (param as TimeSpan?).Value.Ticks / 10;
 | 
			
		||||
			else if (param is MygisGeometry)
 | 
			
		||||
				return (param as MygisGeometry).AsText();
 | 
			
		||||
				return string.Concat("ST_GeomFromText('", (param as MygisGeometry).AsText().Replace("'", "''"), "')");
 | 
			
		||||
			else if (param is IEnumerable) {
 | 
			
		||||
				var sb = new StringBuilder();
 | 
			
		||||
				var ie = param as IEnumerable;
 | 
			
		||||
 
 | 
			
		||||
@@ -4,6 +4,7 @@ using MySql.Data.MySqlClient;
 | 
			
		||||
using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.Data.Common;
 | 
			
		||||
using System.Text;
 | 
			
		||||
 | 
			
		||||
namespace FreeSql.MySql {
 | 
			
		||||
 | 
			
		||||
@@ -70,6 +71,24 @@ namespace FreeSql.MySql {
 | 
			
		||||
			}
 | 
			
		||||
			return columnName;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		internal override string GetNoneParamaterSqlValue(Type type, object value) {
 | 
			
		||||
			if (value == null) return "NULL";
 | 
			
		||||
			if (type == typeof(byte[])) {
 | 
			
		||||
				var bytes = value as byte[];
 | 
			
		||||
				var sb = new StringBuilder().Append("0x");
 | 
			
		||||
				foreach (var vc in bytes) {
 | 
			
		||||
					if (vc < 10) sb.Append("0");
 | 
			
		||||
					sb.Append(vc.ToString("X"));
 | 
			
		||||
				}
 | 
			
		||||
				return sb.ToString(); //val = Encoding.UTF8.GetString(val as byte[]);
 | 
			
		||||
			} else if (type == typeof(TimeSpan) || type == typeof(TimeSpan?)) {
 | 
			
		||||
				var ts = (TimeSpan)value;
 | 
			
		||||
				value = $"{Math.Floor(ts.TotalHours)}:{ts.Minutes}:{ts.Seconds}";
 | 
			
		||||
			}
 | 
			
		||||
			return FormatSql("{0}", value, 1);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		internal override string DbName => "MySql";
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -40,7 +40,9 @@ namespace FreeSql.Oracle.Curd {
 | 
			
		||||
			}
 | 
			
		||||
			sbtb.Append(") ");
 | 
			
		||||
 | 
			
		||||
			_params = new DbParameter[colidx * _source.Count];
 | 
			
		||||
			//_params = new DbParameter[colidx * _source.Count];
 | 
			
		||||
			_params = new DbParameter[0];
 | 
			
		||||
			//_params = new DbParameter[colidx * 5]; //批量添加第5行起,不使用参数化
 | 
			
		||||
			var didx = 0;
 | 
			
		||||
			foreach (var d in _source) {
 | 
			
		||||
				if (_source.Count > 1) sb.Append("\r\n");
 | 
			
		||||
@@ -51,21 +53,25 @@ namespace FreeSql.Oracle.Curd {
 | 
			
		||||
				foreach (var col in _table.Columns.Values) {
 | 
			
		||||
					if (col.Attribute.IsIdentity == false && _ignore.ContainsKey(col.Attribute.Name) == false) {
 | 
			
		||||
						if (colidx2 > 0) sb.Append(", ");
 | 
			
		||||
						sb.Append(_commonUtils.QuoteWriteParamter(col.CsType, $"{_commonUtils.QuoteParamterName(col.CsName)}{didx}"));
 | 
			
		||||
						object val = null;
 | 
			
		||||
						if (_table.Properties.TryGetValue(col.CsName, out var tryp)) {
 | 
			
		||||
							val = tryp.GetValue(d);
 | 
			
		||||
							if (col.Attribute.IsPrimary && (col.CsType == typeof(Guid) || col.CsType == typeof(Guid?))
 | 
			
		||||
								&& (val == null || (Guid)val == Guid.Empty)) tryp.SetValue(d, val = FreeUtil.NewMongodbId());
 | 
			
		||||
						}
 | 
			
		||||
						_params[didx * colidx + colidx2] = _commonUtils.AppendParamter(null, $"{col.CsName}{didx}", col.CsType, val);
 | 
			
		||||
						//if (didx >= 5)
 | 
			
		||||
							sb.Append(_commonUtils.GetNoneParamaterSqlValue(col.CsType, val));
 | 
			
		||||
						//else {
 | 
			
		||||
						//	sb.Append(_commonUtils.QuoteWriteParamter(col.CsType, $"{_commonUtils.QuoteParamterName(col.CsName)}{didx}"));
 | 
			
		||||
						//	_params[didx * colidx + colidx2] = _commonUtils.AppendParamter(null, $"{col.CsName}{didx}", col.CsType, val);
 | 
			
		||||
						//}
 | 
			
		||||
						++colidx2;
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
				sb.Append(")");
 | 
			
		||||
				++didx;
 | 
			
		||||
			}
 | 
			
		||||
			if (_source.Count > 1) sb.Append("\r\n SELECT 1 FROM DUAL");
 | 
			
		||||
			//if (_source.Count > 1) sb.Append("\r\n SELECT 1 FROM DUAL");
 | 
			
		||||
			return sb.ToString();
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -34,14 +34,10 @@ namespace FreeSql.Oracle {
 | 
			
		||||
				return ((Enum)param).ToInt64();
 | 
			
		||||
			else if (decimal.TryParse(string.Concat(param), out var trydec))
 | 
			
		||||
				return param;
 | 
			
		||||
			else if (param is DateTime)
 | 
			
		||||
				return string.Concat("to_timestamp('", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.ffffff"), "','YYYY-MM-DD HH24:MI:SS.FF6)");
 | 
			
		||||
			else if (param is DateTime?)
 | 
			
		||||
				return string.Concat("to_timestamp('", (param as DateTime?).Value.ToString("yyyy-MM-dd HH:mm:ss.ffffff"), "','YYYY-MM-DD HH24:MI:SS.FF6)");
 | 
			
		||||
			else if (param is TimeSpan)
 | 
			
		||||
			else if (param is DateTime || param is DateTime?)
 | 
			
		||||
				return string.Concat("to_timestamp('", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.ffffff"), "','YYYY-MM-DD HH24:MI:SS.FF6')");
 | 
			
		||||
			else if (param is TimeSpan || param is TimeSpan?)
 | 
			
		||||
				return $"numtodsinterval({((TimeSpan)param).Ticks * 1.0 / 10000000},'second')";
 | 
			
		||||
			else if (param is TimeSpan?)
 | 
			
		||||
				return $"numtodsinterval({(param as TimeSpan?).Value.Ticks * 1.0 / 10000000},'second')";
 | 
			
		||||
			else if (param is IEnumerable) {
 | 
			
		||||
				var sb = new StringBuilder();
 | 
			
		||||
				var ie = param as IEnumerable;
 | 
			
		||||
 
 | 
			
		||||
@@ -4,6 +4,7 @@ using Oracle.ManagedDataAccess.Client;
 | 
			
		||||
using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.Data.Common;
 | 
			
		||||
using System.Text;
 | 
			
		||||
 | 
			
		||||
namespace FreeSql.Oracle {
 | 
			
		||||
 | 
			
		||||
@@ -46,6 +47,21 @@ namespace FreeSql.Oracle {
 | 
			
		||||
 | 
			
		||||
		internal override string QuoteWriteParamter(Type type, string paramterName) => paramterName;
 | 
			
		||||
		internal override string QuoteReadColumn(Type type, string columnName) => columnName;
 | 
			
		||||
 | 
			
		||||
		internal override string GetNoneParamaterSqlValue(Type type, object value) {
 | 
			
		||||
			if (value == null) return "NULL";
 | 
			
		||||
			if (type == typeof(byte[])) {
 | 
			
		||||
				var bytes = value as byte[];
 | 
			
		||||
				var sb = new StringBuilder().Append("rawtohex('0x");
 | 
			
		||||
				foreach (var vc in bytes) {
 | 
			
		||||
					if (vc < 10) sb.Append("0");
 | 
			
		||||
					sb.Append(vc.ToString("X"));
 | 
			
		||||
				}
 | 
			
		||||
				return sb.Append("')").ToString();
 | 
			
		||||
			}
 | 
			
		||||
			return FormatSql("{0}", value, 1);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		internal override string DbName => "Oracle";
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -36,14 +36,10 @@ namespace FreeSql.PostgreSQL {
 | 
			
		||||
				return string.Concat("'", param.ToString().Replace("'", "''"), "'");
 | 
			
		||||
			else if (decimal.TryParse(string.Concat(param), out var trydec))
 | 
			
		||||
				return param;
 | 
			
		||||
			else if (param is DateTime)
 | 
			
		||||
			else if (param is DateTime || param is DateTime?)
 | 
			
		||||
				return string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.ffffff"), "'");
 | 
			
		||||
			else if (param is DateTime?)
 | 
			
		||||
				return string.Concat("'", (param as DateTime?).Value.ToString("yyyy-MM-dd HH:mm:ss.ffffff"), "'");
 | 
			
		||||
			else if (param is TimeSpan)
 | 
			
		||||
			else if (param is TimeSpan || param is TimeSpan?)
 | 
			
		||||
				return ((TimeSpan)param).Ticks / 10;
 | 
			
		||||
			else if (param is TimeSpan?)
 | 
			
		||||
				return (param as TimeSpan?).Value.Ticks / 10;
 | 
			
		||||
			else if (param is JToken || param is JObject || param is JArray)
 | 
			
		||||
				return string.Concat("'", param.ToString().Replace("'", "''"), "'::jsonb");
 | 
			
		||||
			else if ((isdic = param is Dictionary<string, string>) ||
 | 
			
		||||
 
 | 
			
		||||
@@ -7,6 +7,7 @@ using System.Collections.Generic;
 | 
			
		||||
using System.Data.Common;
 | 
			
		||||
using System.Linq;
 | 
			
		||||
using System.Net;
 | 
			
		||||
using System.Text;
 | 
			
		||||
 | 
			
		||||
namespace FreeSql.PostgreSQL {
 | 
			
		||||
 | 
			
		||||
@@ -102,6 +103,26 @@ namespace FreeSql.PostgreSQL {
 | 
			
		||||
 | 
			
		||||
		internal override string QuoteWriteParamter(Type type, string paramterName) => paramterName;
 | 
			
		||||
		internal override string QuoteReadColumn(Type type, string columnName) => columnName;
 | 
			
		||||
 | 
			
		||||
		internal override string GetNoneParamaterSqlValue(Type type, object value) {
 | 
			
		||||
			if (value == null) return "NULL";
 | 
			
		||||
			value = getParamterValue(type, value);
 | 
			
		||||
			var type2 = value.GetType();
 | 
			
		||||
			if (type2 == typeof(byte[])) {
 | 
			
		||||
				var bytes = value as byte[];
 | 
			
		||||
				var sb = new StringBuilder().Append("E'\\x");
 | 
			
		||||
				foreach (var vc in bytes) {
 | 
			
		||||
					if (vc < 10) sb.Append("0");
 | 
			
		||||
					sb.Append(vc.ToString("X"));
 | 
			
		||||
				}
 | 
			
		||||
				return sb.Append("'").ToString(); //val = Encoding.UTF8.GetString(val as byte[]);
 | 
			
		||||
			} else if (type2 == typeof(TimeSpan) || type2 == typeof(TimeSpan?)) {
 | 
			
		||||
				var ts = (TimeSpan)value;
 | 
			
		||||
				value = $"{ts.Hours}:{ts.Minutes}:{ts.Seconds}";
 | 
			
		||||
			}
 | 
			
		||||
			return FormatSql("{0}", value, 1);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		internal override string DbName => "PostgreSQL";
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,9 @@
 | 
			
		||||
using FreeSql.Internal;
 | 
			
		||||
using SafeObjectPool;
 | 
			
		||||
using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.Data;
 | 
			
		||||
using System.Data.Common;
 | 
			
		||||
using System.Linq;
 | 
			
		||||
using System.Text;
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
 | 
			
		||||
@@ -14,128 +14,49 @@ namespace FreeSql.SqlServer.Curd {
 | 
			
		||||
			: base(orm, commonUtils, commonExpression) {
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		public override int ExecuteAffrows() {
 | 
			
		||||
			var sql = this.ToSql2100();
 | 
			
		||||
			switch (sql.Count) {
 | 
			
		||||
				case 0: return 0;
 | 
			
		||||
				case 1: return _orm.Ado.ExecuteNonQuery(_transaction, CommandType.Text, sql[0].Item1, sql[0].Item2);
 | 
			
		||||
				default:
 | 
			
		||||
					var affrows = 0;
 | 
			
		||||
					if (_transaction == null) {
 | 
			
		||||
						using (var conn = _orm.Ado.MasterPool.Get()) {
 | 
			
		||||
							var tran = conn.Value.BeginTransaction();
 | 
			
		||||
							try {
 | 
			
		||||
								foreach (var s in sql)
 | 
			
		||||
									affrows += _orm.Ado.ExecuteNonQuery(tran, CommandType.Text, s.Item1, s.Item2);
 | 
			
		||||
								tran.Commit();
 | 
			
		||||
							} catch {
 | 
			
		||||
								tran.Rollback();
 | 
			
		||||
							}
 | 
			
		||||
						}
 | 
			
		||||
					} else {
 | 
			
		||||
						foreach (var s in sql)
 | 
			
		||||
							affrows += _orm.Ado.ExecuteNonQuery(_transaction, CommandType.Text, s.Item1, s.Item2);
 | 
			
		||||
					}
 | 
			
		||||
					return affrows;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		async public override Task<int> ExecuteAffrowsAsync() {
 | 
			
		||||
			var sql = this.ToSql2100();
 | 
			
		||||
			switch (sql.Count) {
 | 
			
		||||
				case 0: return 0;
 | 
			
		||||
				case 1: return await _orm.Ado.ExecuteNonQueryAsync(_transaction, CommandType.Text, sql[0].Item1, sql[0].Item2);
 | 
			
		||||
				default:
 | 
			
		||||
					var affrows = 0;
 | 
			
		||||
					if (_transaction == null) {
 | 
			
		||||
						using (var conn = await _orm.Ado.MasterPool.GetAsync()) {
 | 
			
		||||
							var tran = conn.Value.BeginTransaction();
 | 
			
		||||
							try {
 | 
			
		||||
								foreach (var s in sql)
 | 
			
		||||
									affrows += await _orm.Ado.ExecuteNonQueryAsync(tran, CommandType.Text, s.Item1, s.Item2);
 | 
			
		||||
								tran.Commit();
 | 
			
		||||
							} catch {
 | 
			
		||||
								tran.Rollback();
 | 
			
		||||
							}
 | 
			
		||||
						}
 | 
			
		||||
					} else {
 | 
			
		||||
						foreach (var s in sql)
 | 
			
		||||
							affrows += await _orm.Ado.ExecuteNonQueryAsync(_transaction, CommandType.Text, s.Item1, s.Item2);
 | 
			
		||||
					}
 | 
			
		||||
					return affrows;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		public override long ExecuteIdentity() {
 | 
			
		||||
			var sql = this.ToSql2100();
 | 
			
		||||
			switch (sql.Count) {
 | 
			
		||||
				case 0: return 0;
 | 
			
		||||
				case 1:
 | 
			
		||||
					if (string.IsNullOrEmpty(sql[0].Item1)) return 0;
 | 
			
		||||
					return long.TryParse(string.Concat(_orm.Ado.ExecuteScalar(_transaction, CommandType.Text, string.Concat(sql[0].Item1, "; SELECT SCOPE_IDENTITY();"), sql[0].Item2)), out var trylng) ? trylng : 0;
 | 
			
		||||
				default:
 | 
			
		||||
					long ret = 0;
 | 
			
		||||
					if (_transaction == null) {
 | 
			
		||||
						using (var conn = _orm.Ado.MasterPool.Get()) {
 | 
			
		||||
							var tran = conn.Value.BeginTransaction();
 | 
			
		||||
							try {
 | 
			
		||||
								for (var a = 0; a < sql.Count; a++) {
 | 
			
		||||
									var s = sql[a];
 | 
			
		||||
									if (a < sql.Count - 1) _orm.Ado.ExecuteNonQuery(tran, CommandType.Text, s.Item1, s.Item2);
 | 
			
		||||
									else ret = long.TryParse(string.Concat(_orm.Ado.ExecuteScalar(tran, CommandType.Text, string.Concat(s.Item1, "; SELECT SCOPE_IDENTITY();"), s.Item2)), out trylng) ? trylng : 0;
 | 
			
		||||
								}
 | 
			
		||||
								tran.Commit();
 | 
			
		||||
							} catch {
 | 
			
		||||
								tran.Rollback();
 | 
			
		||||
							}
 | 
			
		||||
						}
 | 
			
		||||
					} else {
 | 
			
		||||
						for (var a = 0; a < sql.Count; a++) {
 | 
			
		||||
							var s = sql[a];
 | 
			
		||||
							if (a < sql.Count - 1) _orm.Ado.ExecuteNonQuery(_transaction, CommandType.Text, s.Item1, s.Item2);
 | 
			
		||||
							else ret = long.TryParse(string.Concat(_orm.Ado.ExecuteScalar(_transaction, CommandType.Text, string.Concat(s.Item1, "; SELECT SCOPE_IDENTITY();"), s.Item2)), out trylng) ? trylng : 0;
 | 
			
		||||
						}
 | 
			
		||||
					}
 | 
			
		||||
					return ret;
 | 
			
		||||
			}
 | 
			
		||||
			//if (_source?.Count > 999) {
 | 
			
		||||
			//	List<IInsert<T1>> inserts = new List<IInsert<T1>>();
 | 
			
		||||
			//	var idx = 0;
 | 
			
		||||
			//	while (idx < _source.Count) {
 | 
			
		||||
			//		var count = Math.Min(_source.Count, idx + 999) - idx;
 | 
			
		||||
			//		var insert = _orm.Insert<T1>().AppendData(_source.GetRange(idx, count));
 | 
			
		||||
			//		_
 | 
			
		||||
			//		inserts.Add(insert);
 | 
			
		||||
			//		idx += 999;
 | 
			
		||||
			//	}
 | 
			
		||||
			//	Object<DbConnection> conn = null;
 | 
			
		||||
			//	var trans = _transaction;
 | 
			
		||||
			//	if (_transaction == null) {
 | 
			
		||||
			//		conn = _orm.Ado.MasterPool.Get();
 | 
			
		||||
			//		trans = conn.Value.BeginTransaction();
 | 
			
		||||
			//	}
 | 
			
		||||
			//	try {
 | 
			
		||||
			//		for (var a = 0; a < inserts.Count; a++) {
 | 
			
		||||
			//			inserts[a].WithTransaction(trans)
 | 
			
		||||
			//		}
 | 
			
		||||
			//		if (_transaction == null) trans.Commit();
 | 
			
		||||
			//	} catch {
 | 
			
		||||
			//		if (_transaction == null) trans.Rollback();
 | 
			
		||||
			//		throw;
 | 
			
		||||
			//	}
 | 
			
		||||
			//}
 | 
			
		||||
			var sql = this.ToSql();
 | 
			
		||||
			if (string.IsNullOrEmpty(sql)) return 0;
 | 
			
		||||
 | 
			
		||||
			return long.TryParse(string.Concat(_orm.Ado.ExecuteScalar(_transaction, CommandType.Text, string.Concat(sql, "; SELECT SCOPE_IDENTITY();"), _params)), out var trylng) ? trylng : 0;
 | 
			
		||||
		}
 | 
			
		||||
		async public override Task<long> ExecuteIdentityAsync() {
 | 
			
		||||
			var sql = this.ToSql2100();
 | 
			
		||||
			switch (sql.Count) {
 | 
			
		||||
				case 0: return 0;
 | 
			
		||||
				case 1:
 | 
			
		||||
					if (string.IsNullOrEmpty(sql[0].Item1)) return 0;
 | 
			
		||||
					return long.TryParse(string.Concat(await _orm.Ado.ExecuteScalarAsync(_transaction, CommandType.Text, string.Concat(sql[0].Item1, "; SELECT SCOPE_IDENTITY();"), sql[0].Item2)), out var trylng) ? trylng : 0;
 | 
			
		||||
				default:
 | 
			
		||||
					long ret = 0;
 | 
			
		||||
					if (_transaction == null) {
 | 
			
		||||
						using (var conn = await _orm.Ado.MasterPool.GetAsync()) {
 | 
			
		||||
							var tran = conn.Value.BeginTransaction();
 | 
			
		||||
							try {
 | 
			
		||||
								for (var a = 0; a < sql.Count; a++) {
 | 
			
		||||
									var s = sql[a];
 | 
			
		||||
									if (a < sql.Count - 1) await _orm.Ado.ExecuteNonQueryAsync(tran, CommandType.Text, s.Item1, s.Item2);
 | 
			
		||||
									else ret = long.TryParse(string.Concat(await _orm.Ado.ExecuteScalarAsync(tran, CommandType.Text, string.Concat(s.Item1, "; SELECT SCOPE_IDENTITY();"), s.Item2)), out trylng) ? trylng : 0;
 | 
			
		||||
								}
 | 
			
		||||
								tran.Commit();
 | 
			
		||||
							} catch {
 | 
			
		||||
								tran.Rollback();
 | 
			
		||||
							}
 | 
			
		||||
						}
 | 
			
		||||
					} else {
 | 
			
		||||
						for (var a = 0; a < sql.Count; a++) {
 | 
			
		||||
							var s = sql[a];
 | 
			
		||||
							if (a < sql.Count - 1) await _orm.Ado.ExecuteNonQueryAsync(_transaction, CommandType.Text, s.Item1, s.Item2);
 | 
			
		||||
							else ret = long.TryParse(string.Concat(await _orm.Ado.ExecuteScalarAsync(_transaction, CommandType.Text, string.Concat(s.Item1, "; SELECT SCOPE_IDENTITY();"), s.Item2)), out trylng) ? trylng : 0;
 | 
			
		||||
						}
 | 
			
		||||
					}
 | 
			
		||||
					return ret;
 | 
			
		||||
			}
 | 
			
		||||
			var sql = this.ToSql();
 | 
			
		||||
			if (string.IsNullOrEmpty(sql)) return 0;
 | 
			
		||||
 | 
			
		||||
			return long.TryParse(string.Concat(await _orm.Ado.ExecuteScalarAsync(_transaction, CommandType.Text, string.Concat(sql, "; SELECT SCOPE_IDENTITY();"), _params)), out var trylng) ? trylng : 0;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		public override List<T1> ExecuteInserted() {
 | 
			
		||||
			string output = null;
 | 
			
		||||
			Func<string, string> getOutputSql = oldsql => {
 | 
			
		||||
				if (string.IsNullOrEmpty(output)) {
 | 
			
		||||
			var sql = this.ToSql();
 | 
			
		||||
			if (string.IsNullOrEmpty(sql)) return new List<T1>();
 | 
			
		||||
 | 
			
		||||
			var sb = new StringBuilder();
 | 
			
		||||
			sb.Append(" OUTPUT ");
 | 
			
		||||
			var colidx = 0;
 | 
			
		||||
@@ -144,46 +65,18 @@ namespace FreeSql.SqlServer.Curd {
 | 
			
		||||
				sb.Append(_commonUtils.QuoteReadColumn(col.CsType, $"INSERTED.{_commonUtils.QuoteSqlName(col.Attribute.Name)}")).Append(" as ").Append(_commonUtils.QuoteSqlName(col.CsName));
 | 
			
		||||
				++colidx;
 | 
			
		||||
			}
 | 
			
		||||
					output = sb.ToString();
 | 
			
		||||
				}
 | 
			
		||||
				var validx = oldsql.IndexOf(") VALUES");
 | 
			
		||||
				if (validx == -1) throw new ArgumentException("找不到 VALUES");
 | 
			
		||||
				var newsql = new StringBuilder().Append(output);
 | 
			
		||||
				newsql.Insert(0, oldsql.Substring(0, validx + 1));
 | 
			
		||||
				newsql.Append(oldsql.Substring(validx + 1));
 | 
			
		||||
				return newsql.ToString();
 | 
			
		||||
			};
 | 
			
		||||
 | 
			
		||||
			var sql = this.ToSql2100();
 | 
			
		||||
			switch (sql.Count) {
 | 
			
		||||
				case 0: return new List<T1>();
 | 
			
		||||
				case 1:
 | 
			
		||||
					if (string.IsNullOrEmpty(sql[0].Item1)) return new List<T1>();
 | 
			
		||||
					return _orm.Ado.Query<T1>(_transaction, CommandType.Text, getOutputSql(sql[0].Item1), sql[0].Item2);
 | 
			
		||||
				default:
 | 
			
		||||
					var ret = new List<T1>();
 | 
			
		||||
					if (_transaction == null) {
 | 
			
		||||
						using (var conn = _orm.Ado.MasterPool.Get()) {
 | 
			
		||||
							var tran = conn.Value.BeginTransaction();
 | 
			
		||||
							try {
 | 
			
		||||
								foreach (var s in sql)
 | 
			
		||||
									ret.AddRange(_orm.Ado.Query<T1>(tran, CommandType.Text, getOutputSql(s.Item1), s.Item2));
 | 
			
		||||
								tran.Commit();
 | 
			
		||||
							} catch {
 | 
			
		||||
								tran.Rollback();
 | 
			
		||||
							}
 | 
			
		||||
						}
 | 
			
		||||
					} else {
 | 
			
		||||
						foreach (var s in sql)
 | 
			
		||||
							ret.AddRange(_orm.Ado.Query<T1>(_transaction, CommandType.Text, getOutputSql(s.Item1), s.Item2));
 | 
			
		||||
					}
 | 
			
		||||
					return ret;
 | 
			
		||||
			}
 | 
			
		||||
			var validx = sql.IndexOf(") VALUES");
 | 
			
		||||
			if (validx == -1) throw new ArgumentException("找不到 VALUES");
 | 
			
		||||
			sb.Insert(0, sql.Substring(0, validx + 1));
 | 
			
		||||
			sb.Append(sql.Substring(validx + 1));
 | 
			
		||||
 | 
			
		||||
			return _orm.Ado.Query<T1>(_transaction, CommandType.Text, sb.ToString(), _params);
 | 
			
		||||
		}
 | 
			
		||||
		async public override Task<List<T1>> ExecuteInsertedAsync() {
 | 
			
		||||
			string output = null;
 | 
			
		||||
			Func<string, string> getOutputSql = oldsql => {
 | 
			
		||||
				if (string.IsNullOrEmpty(output)) {
 | 
			
		||||
			var sql = this.ToSql();
 | 
			
		||||
			if (string.IsNullOrEmpty(sql)) return new List<T1>();
 | 
			
		||||
 | 
			
		||||
			var sb = new StringBuilder();
 | 
			
		||||
			sb.Append(" OUTPUT ");
 | 
			
		||||
			var colidx = 0;
 | 
			
		||||
@@ -192,89 +85,13 @@ namespace FreeSql.SqlServer.Curd {
 | 
			
		||||
				sb.Append(_commonUtils.QuoteReadColumn(col.CsType, $"INSERTED.{_commonUtils.QuoteSqlName(col.Attribute.Name)}")).Append(" as ").Append(_commonUtils.QuoteSqlName(col.CsName));
 | 
			
		||||
				++colidx;
 | 
			
		||||
			}
 | 
			
		||||
					output = sb.ToString();
 | 
			
		||||
				}
 | 
			
		||||
				var validx = oldsql.IndexOf(") VALUES");
 | 
			
		||||
 | 
			
		||||
			var validx = sql.IndexOf(") VALUES");
 | 
			
		||||
			if (validx == -1) throw new ArgumentException("找不到 VALUES");
 | 
			
		||||
				var newsql = new StringBuilder().Append(output);
 | 
			
		||||
				newsql.Insert(0, oldsql.Substring(0, validx + 1));
 | 
			
		||||
				newsql.Append(oldsql.Substring(validx + 1));
 | 
			
		||||
				return oldsql;
 | 
			
		||||
			};
 | 
			
		||||
			sb.Insert(0, sql.Substring(0, validx + 1));
 | 
			
		||||
			sb.Append(sql.Substring(validx + 1));
 | 
			
		||||
 | 
			
		||||
			var sql = this.ToSql2100();
 | 
			
		||||
			switch (sql.Count) {
 | 
			
		||||
				case 0: return new List<T1>();
 | 
			
		||||
				case 1:
 | 
			
		||||
					if (string.IsNullOrEmpty(sql[0].Item1)) return new List<T1>();
 | 
			
		||||
					return await _orm.Ado.QueryAsync<T1>(_transaction, CommandType.Text, getOutputSql(sql[0].Item1), sql[0].Item2);
 | 
			
		||||
				default:
 | 
			
		||||
					var ret = new List<T1>();
 | 
			
		||||
					if (_transaction == null) {
 | 
			
		||||
						using (var conn = await _orm.Ado.MasterPool.GetAsync()) {
 | 
			
		||||
							var tran = conn.Value.BeginTransaction();
 | 
			
		||||
							try {
 | 
			
		||||
								foreach (var s in sql)
 | 
			
		||||
									ret.AddRange(await _orm.Ado.QueryAsync<T1>(tran, CommandType.Text, getOutputSql(s.Item1), s.Item2));
 | 
			
		||||
								tran.Commit();
 | 
			
		||||
							} catch {
 | 
			
		||||
								tran.Rollback();
 | 
			
		||||
							}
 | 
			
		||||
						}
 | 
			
		||||
					} else {
 | 
			
		||||
						foreach (var s in sql)
 | 
			
		||||
							ret.AddRange(await _orm.Ado.QueryAsync<T1>(_transaction, CommandType.Text, getOutputSql(s.Item1), s.Item2));
 | 
			
		||||
					}
 | 
			
		||||
					return ret;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		public List<(string, DbParameter[])> ToSql2100() { //传入的请求具有过多的参数。该服务器支持最多 2100 个参数。请减少参数的数目,然后重新发送该请求。
 | 
			
		||||
			if (_source == null || _source.Any() == false) return new List<(string, DbParameter[])>();
 | 
			
		||||
			var ret = new List<(string, DbParameter[])>();
 | 
			
		||||
			var sbhead = new StringBuilder();
 | 
			
		||||
			sbhead.Append("INSERT INTO ").Append(_commonUtils.QuoteSqlName(_tableRule?.Invoke(_table.DbName) ?? _table.DbName)).Append("(");
 | 
			
		||||
			var colidx = 0;
 | 
			
		||||
			foreach (var col in _table.Columns.Values)
 | 
			
		||||
				if (col.Attribute.IsIdentity == false && _ignore.ContainsKey(col.Attribute.Name) == false) {
 | 
			
		||||
					if (colidx > 0) sbhead.Append(", ");
 | 
			
		||||
					sbhead.Append(_commonUtils.QuoteSqlName(col.Attribute.Name));
 | 
			
		||||
					++colidx;
 | 
			
		||||
				}
 | 
			
		||||
			sbhead.Append(") VALUES");
 | 
			
		||||
			var sbh = sbhead.ToString();
 | 
			
		||||
 | 
			
		||||
			var sbsql = new StringBuilder().Append(sbh);
 | 
			
		||||
			var sbsqlParams = new List<DbParameter>();
 | 
			
		||||
			var didx = 0;
 | 
			
		||||
			foreach (var d in _source) {
 | 
			
		||||
				if ((didx + 1) * colidx >= 2100) {
 | 
			
		||||
					ret.Add((sbsql.ToString(), sbsqlParams.ToArray()));
 | 
			
		||||
					sbsql.Clear().Append(sbh);
 | 
			
		||||
					sbsqlParams.Clear();
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				if (sbsqlParams.Count > 0) sbsql.Append(", ");
 | 
			
		||||
				sbsql.Append("(");
 | 
			
		||||
				var colidx2 = 0;
 | 
			
		||||
				foreach (var col in _table.Columns.Values)
 | 
			
		||||
					if (col.Attribute.IsIdentity == false && _ignore.ContainsKey(col.Attribute.Name) == false) {
 | 
			
		||||
						if (colidx2 > 0) sbsql.Append(", ");
 | 
			
		||||
						sbsql.Append(_commonUtils.QuoteWriteParamter(col.CsType, $"{_commonUtils.QuoteParamterName(col.CsName)}{didx}"));
 | 
			
		||||
						object val = null;
 | 
			
		||||
						if (_table.Properties.TryGetValue(col.CsName, out var tryp)) {
 | 
			
		||||
							val = tryp.GetValue(d);
 | 
			
		||||
							if (col.Attribute.IsPrimary && (col.CsType == typeof(Guid) || col.CsType == typeof(Guid?))
 | 
			
		||||
								&& (val == null || (Guid)val == Guid.Empty)) tryp.SetValue(d, val = FreeUtil.NewMongodbId());
 | 
			
		||||
						}
 | 
			
		||||
						sbsqlParams.Add(_commonUtils.AppendParamter(null, $"{col.CsName}{didx}", col.CsType, val));
 | 
			
		||||
						++colidx2;
 | 
			
		||||
					}
 | 
			
		||||
				sbsql.Append(")");
 | 
			
		||||
				++didx;
 | 
			
		||||
			}
 | 
			
		||||
			ret.Add((sbsql.ToString(), sbsqlParams.ToArray()));
 | 
			
		||||
			return ret;
 | 
			
		||||
			return await _orm.Ado.QueryAsync<T1>(_transaction, CommandType.Text, sb.ToString(), _params);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										281
									
								
								FreeSql/SqlServer/Curd/SqlServerInsert2100.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										281
									
								
								FreeSql/SqlServer/Curd/SqlServerInsert2100.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,281 @@
 | 
			
		||||
//using FreeSql.Internal;
 | 
			
		||||
//using System;
 | 
			
		||||
//using System.Collections.Generic;
 | 
			
		||||
//using System.Data;
 | 
			
		||||
//using System.Data.Common;
 | 
			
		||||
//using System.Linq;
 | 
			
		||||
//using System.Text;
 | 
			
		||||
//using System.Threading.Tasks;
 | 
			
		||||
 | 
			
		||||
//namespace FreeSql.SqlServer.Curd {
 | 
			
		||||
 | 
			
		||||
//	class SqlServerInsert<T1> : Internal.CommonProvider.InsertProvider<T1> where T1 : class {
 | 
			
		||||
//		public SqlServerInsert(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression)
 | 
			
		||||
//			: base(orm, commonUtils, commonExpression) {
 | 
			
		||||
//		}
 | 
			
		||||
 | 
			
		||||
//		public override int ExecuteAffrows() {
 | 
			
		||||
//			var sql = this.ToSql2100();
 | 
			
		||||
//			switch (sql.Count) {
 | 
			
		||||
//				case 0: return 0;
 | 
			
		||||
//				case 1: return _orm.Ado.ExecuteNonQuery(_transaction, CommandType.Text, sql[0].Item1, sql[0].Item2);
 | 
			
		||||
//				default:
 | 
			
		||||
//					var affrows = 0;
 | 
			
		||||
//					if (_transaction == null) {
 | 
			
		||||
//						using (var conn = _orm.Ado.MasterPool.Get()) {
 | 
			
		||||
//							var tran = conn.Value.BeginTransaction();
 | 
			
		||||
//							try {
 | 
			
		||||
//								foreach (var s in sql)
 | 
			
		||||
//									affrows += _orm.Ado.ExecuteNonQuery(tran, CommandType.Text, s.Item1, s.Item2);
 | 
			
		||||
//								tran.Commit();
 | 
			
		||||
//							} catch {
 | 
			
		||||
//								tran.Rollback();
 | 
			
		||||
//							}
 | 
			
		||||
//						}
 | 
			
		||||
//					} else {
 | 
			
		||||
//						foreach (var s in sql)
 | 
			
		||||
//							affrows += _orm.Ado.ExecuteNonQuery(_transaction, CommandType.Text, s.Item1, s.Item2);
 | 
			
		||||
//					}
 | 
			
		||||
//					return affrows;
 | 
			
		||||
//			}
 | 
			
		||||
//		}
 | 
			
		||||
//		async public override Task<int> ExecuteAffrowsAsync() {
 | 
			
		||||
//			var sql = this.ToSql2100();
 | 
			
		||||
//			switch (sql.Count) {
 | 
			
		||||
//				case 0: return 0;
 | 
			
		||||
//				case 1: return await _orm.Ado.ExecuteNonQueryAsync(_transaction, CommandType.Text, sql[0].Item1, sql[0].Item2);
 | 
			
		||||
//				default:
 | 
			
		||||
//					var affrows = 0;
 | 
			
		||||
//					if (_transaction == null) {
 | 
			
		||||
//						using (var conn = await _orm.Ado.MasterPool.GetAsync()) {
 | 
			
		||||
//							var tran = conn.Value.BeginTransaction();
 | 
			
		||||
//							try {
 | 
			
		||||
//								foreach (var s in sql)
 | 
			
		||||
//									affrows += await _orm.Ado.ExecuteNonQueryAsync(tran, CommandType.Text, s.Item1, s.Item2);
 | 
			
		||||
//								tran.Commit();
 | 
			
		||||
//							} catch {
 | 
			
		||||
//								tran.Rollback();
 | 
			
		||||
//							}
 | 
			
		||||
//						}
 | 
			
		||||
//					} else {
 | 
			
		||||
//						foreach (var s in sql)
 | 
			
		||||
//							affrows += await _orm.Ado.ExecuteNonQueryAsync(_transaction, CommandType.Text, s.Item1, s.Item2);
 | 
			
		||||
//					}
 | 
			
		||||
//					return affrows;
 | 
			
		||||
//			}
 | 
			
		||||
//		}
 | 
			
		||||
 | 
			
		||||
//		public override long ExecuteIdentity() {
 | 
			
		||||
//			var sql = this.ToSql2100();
 | 
			
		||||
//			switch (sql.Count) {
 | 
			
		||||
//				case 0: return 0;
 | 
			
		||||
//				case 1:
 | 
			
		||||
//					if (string.IsNullOrEmpty(sql[0].Item1)) return 0;
 | 
			
		||||
//					return long.TryParse(string.Concat(_orm.Ado.ExecuteScalar(_transaction, CommandType.Text, string.Concat(sql[0].Item1, "; SELECT SCOPE_IDENTITY();"), sql[0].Item2)), out var trylng) ? trylng : 0;
 | 
			
		||||
//				default:
 | 
			
		||||
//					long ret = 0;
 | 
			
		||||
//					if (_transaction == null) {
 | 
			
		||||
//						using (var conn = _orm.Ado.MasterPool.Get()) {
 | 
			
		||||
//							var tran = conn.Value.BeginTransaction();
 | 
			
		||||
//							try {
 | 
			
		||||
//								for (var a = 0; a < sql.Count; a++) {
 | 
			
		||||
//									var s = sql[a];
 | 
			
		||||
//									if (a < sql.Count - 1) _orm.Ado.ExecuteNonQuery(tran, CommandType.Text, s.Item1, s.Item2);
 | 
			
		||||
//									else ret = long.TryParse(string.Concat(_orm.Ado.ExecuteScalar(tran, CommandType.Text, string.Concat(s.Item1, "; SELECT SCOPE_IDENTITY();"), s.Item2)), out trylng) ? trylng : 0;
 | 
			
		||||
//								}
 | 
			
		||||
//								tran.Commit();
 | 
			
		||||
//							} catch {
 | 
			
		||||
//								tran.Rollback();
 | 
			
		||||
//							}
 | 
			
		||||
//						}
 | 
			
		||||
//					} else {
 | 
			
		||||
//						for (var a = 0; a < sql.Count; a++) {
 | 
			
		||||
//							var s = sql[a];
 | 
			
		||||
//							if (a < sql.Count - 1) _orm.Ado.ExecuteNonQuery(_transaction, CommandType.Text, s.Item1, s.Item2);
 | 
			
		||||
//							else ret = long.TryParse(string.Concat(_orm.Ado.ExecuteScalar(_transaction, CommandType.Text, string.Concat(s.Item1, "; SELECT SCOPE_IDENTITY();"), s.Item2)), out trylng) ? trylng : 0;
 | 
			
		||||
//						}
 | 
			
		||||
//					}
 | 
			
		||||
//					return ret;
 | 
			
		||||
//			}
 | 
			
		||||
//		}
 | 
			
		||||
//		async public override Task<long> ExecuteIdentityAsync() {
 | 
			
		||||
//			var sql = this.ToSql2100();
 | 
			
		||||
//			switch (sql.Count) {
 | 
			
		||||
//				case 0: return 0;
 | 
			
		||||
//				case 1:
 | 
			
		||||
//					if (string.IsNullOrEmpty(sql[0].Item1)) return 0;
 | 
			
		||||
//					return long.TryParse(string.Concat(await _orm.Ado.ExecuteScalarAsync(_transaction, CommandType.Text, string.Concat(sql[0].Item1, "; SELECT SCOPE_IDENTITY();"), sql[0].Item2)), out var trylng) ? trylng : 0;
 | 
			
		||||
//				default:
 | 
			
		||||
//					long ret = 0;
 | 
			
		||||
//					if (_transaction == null) {
 | 
			
		||||
//						using (var conn = await _orm.Ado.MasterPool.GetAsync()) {
 | 
			
		||||
//							var tran = conn.Value.BeginTransaction();
 | 
			
		||||
//							try {
 | 
			
		||||
//								for (var a = 0; a < sql.Count; a++) {
 | 
			
		||||
//									var s = sql[a];
 | 
			
		||||
//									if (a < sql.Count - 1) await _orm.Ado.ExecuteNonQueryAsync(tran, CommandType.Text, s.Item1, s.Item2);
 | 
			
		||||
//									else ret = long.TryParse(string.Concat(await _orm.Ado.ExecuteScalarAsync(tran, CommandType.Text, string.Concat(s.Item1, "; SELECT SCOPE_IDENTITY();"), s.Item2)), out trylng) ? trylng : 0;
 | 
			
		||||
//								}
 | 
			
		||||
//								tran.Commit();
 | 
			
		||||
//							} catch {
 | 
			
		||||
//								tran.Rollback();
 | 
			
		||||
//							}
 | 
			
		||||
//						}
 | 
			
		||||
//					} else {
 | 
			
		||||
//						for (var a = 0; a < sql.Count; a++) {
 | 
			
		||||
//							var s = sql[a];
 | 
			
		||||
//							if (a < sql.Count - 1) await _orm.Ado.ExecuteNonQueryAsync(_transaction, CommandType.Text, s.Item1, s.Item2);
 | 
			
		||||
//							else ret = long.TryParse(string.Concat(await _orm.Ado.ExecuteScalarAsync(_transaction, CommandType.Text, string.Concat(s.Item1, "; SELECT SCOPE_IDENTITY();"), s.Item2)), out trylng) ? trylng : 0;
 | 
			
		||||
//						}
 | 
			
		||||
//					}
 | 
			
		||||
//					return ret;
 | 
			
		||||
//			}
 | 
			
		||||
//		}
 | 
			
		||||
 | 
			
		||||
//		public override List<T1> ExecuteInserted() {
 | 
			
		||||
//			string output = null;
 | 
			
		||||
//			Func<string, string> getOutputSql = oldsql => {
 | 
			
		||||
//				if (string.IsNullOrEmpty(output)) {
 | 
			
		||||
//					var sb = new StringBuilder();
 | 
			
		||||
//					sb.Append(" OUTPUT ");
 | 
			
		||||
//					var colidx = 0;
 | 
			
		||||
//					foreach (var col in _table.Columns.Values) {
 | 
			
		||||
//						if (colidx > 0) sb.Append(", ");
 | 
			
		||||
//						sb.Append(_commonUtils.QuoteReadColumn(col.CsType, $"INSERTED.{_commonUtils.QuoteSqlName(col.Attribute.Name)}")).Append(" as ").Append(_commonUtils.QuoteSqlName(col.CsName));
 | 
			
		||||
//						++colidx;
 | 
			
		||||
//					}
 | 
			
		||||
//					output = sb.ToString();
 | 
			
		||||
//				}
 | 
			
		||||
//				var validx = oldsql.IndexOf(") VALUES");
 | 
			
		||||
//				if (validx == -1) throw new ArgumentException("找不到 VALUES");
 | 
			
		||||
//				var newsql = new StringBuilder().Append(output);
 | 
			
		||||
//				newsql.Insert(0, oldsql.Substring(0, validx + 1));
 | 
			
		||||
//				newsql.Append(oldsql.Substring(validx + 1));
 | 
			
		||||
//				return newsql.ToString();
 | 
			
		||||
//			};
 | 
			
		||||
 | 
			
		||||
//			var sql = this.ToSql2100();
 | 
			
		||||
//			switch (sql.Count) {
 | 
			
		||||
//				case 0: return new List<T1>();
 | 
			
		||||
//				case 1:
 | 
			
		||||
//					if (string.IsNullOrEmpty(sql[0].Item1)) return new List<T1>();
 | 
			
		||||
//					return _orm.Ado.Query<T1>(_transaction, CommandType.Text, getOutputSql(sql[0].Item1), sql[0].Item2);
 | 
			
		||||
//				default:
 | 
			
		||||
//					var ret = new List<T1>();
 | 
			
		||||
//					if (_transaction == null) {
 | 
			
		||||
//						using (var conn = _orm.Ado.MasterPool.Get()) {
 | 
			
		||||
//							var tran = conn.Value.BeginTransaction();
 | 
			
		||||
//							try {
 | 
			
		||||
//								foreach (var s in sql)
 | 
			
		||||
//									ret.AddRange(_orm.Ado.Query<T1>(tran, CommandType.Text, getOutputSql(s.Item1), s.Item2));
 | 
			
		||||
//								tran.Commit();
 | 
			
		||||
//							} catch {
 | 
			
		||||
//								tran.Rollback();
 | 
			
		||||
//							}
 | 
			
		||||
//						}
 | 
			
		||||
//					} else {
 | 
			
		||||
//						foreach (var s in sql)
 | 
			
		||||
//							ret.AddRange(_orm.Ado.Query<T1>(_transaction, CommandType.Text, getOutputSql(s.Item1), s.Item2));
 | 
			
		||||
//					}
 | 
			
		||||
//					return ret;
 | 
			
		||||
//			}
 | 
			
		||||
//		}
 | 
			
		||||
//		async public override Task<List<T1>> ExecuteInsertedAsync() {
 | 
			
		||||
//			string output = null;
 | 
			
		||||
//			Func<string, string> getOutputSql = oldsql => {
 | 
			
		||||
//				if (string.IsNullOrEmpty(output)) {
 | 
			
		||||
//					var sb = new StringBuilder();
 | 
			
		||||
//					sb.Append(" OUTPUT ");
 | 
			
		||||
//					var colidx = 0;
 | 
			
		||||
//					foreach (var col in _table.Columns.Values) {
 | 
			
		||||
//						if (colidx > 0) sb.Append(", ");
 | 
			
		||||
//						sb.Append(_commonUtils.QuoteReadColumn(col.CsType, $"INSERTED.{_commonUtils.QuoteSqlName(col.Attribute.Name)}")).Append(" as ").Append(_commonUtils.QuoteSqlName(col.CsName));
 | 
			
		||||
//						++colidx;
 | 
			
		||||
//					}
 | 
			
		||||
//					output = sb.ToString();
 | 
			
		||||
//				}
 | 
			
		||||
//				var validx = oldsql.IndexOf(") VALUES");
 | 
			
		||||
//				if (validx == -1) throw new ArgumentException("找不到 VALUES");
 | 
			
		||||
//				var newsql = new StringBuilder().Append(output);
 | 
			
		||||
//				newsql.Insert(0, oldsql.Substring(0, validx + 1));
 | 
			
		||||
//				newsql.Append(oldsql.Substring(validx + 1));
 | 
			
		||||
//				return oldsql;
 | 
			
		||||
//			};
 | 
			
		||||
 | 
			
		||||
//			var sql = this.ToSql2100();
 | 
			
		||||
//			switch (sql.Count) {
 | 
			
		||||
//				case 0: return new List<T1>();
 | 
			
		||||
//				case 1:
 | 
			
		||||
//					if (string.IsNullOrEmpty(sql[0].Item1)) return new List<T1>();
 | 
			
		||||
//					return await _orm.Ado.QueryAsync<T1>(_transaction, CommandType.Text, getOutputSql(sql[0].Item1), sql[0].Item2);
 | 
			
		||||
//				default:
 | 
			
		||||
//					var ret = new List<T1>();
 | 
			
		||||
//					if (_transaction == null) {
 | 
			
		||||
//						using (var conn = await _orm.Ado.MasterPool.GetAsync()) {
 | 
			
		||||
//							var tran = conn.Value.BeginTransaction();
 | 
			
		||||
//							try {
 | 
			
		||||
//								foreach (var s in sql)
 | 
			
		||||
//									ret.AddRange(await _orm.Ado.QueryAsync<T1>(tran, CommandType.Text, getOutputSql(s.Item1), s.Item2));
 | 
			
		||||
//								tran.Commit();
 | 
			
		||||
//							} catch {
 | 
			
		||||
//								tran.Rollback();
 | 
			
		||||
//							}
 | 
			
		||||
//						}
 | 
			
		||||
//					} else {
 | 
			
		||||
//						foreach (var s in sql)
 | 
			
		||||
//							ret.AddRange(await _orm.Ado.QueryAsync<T1>(_transaction, CommandType.Text, getOutputSql(s.Item1), s.Item2));
 | 
			
		||||
//					}
 | 
			
		||||
//					return ret;
 | 
			
		||||
//			}
 | 
			
		||||
//		}
 | 
			
		||||
 | 
			
		||||
//		public List<(string, DbParameter[])> ToSql2100() { //传入的请求具有过多的参数。该服务器支持最多 2100 个参数。请减少参数的数目,然后重新发送该请求。
 | 
			
		||||
//			if (_source == null || _source.Any() == false) return new List<(string, DbParameter[])>();
 | 
			
		||||
//			var ret = new List<(string, DbParameter[])>();
 | 
			
		||||
//			var sbhead = new StringBuilder();
 | 
			
		||||
//			sbhead.Append("INSERT INTO ").Append(_commonUtils.QuoteSqlName(_tableRule?.Invoke(_table.DbName) ?? _table.DbName)).Append("(");
 | 
			
		||||
//			var colidx = 0;
 | 
			
		||||
//			foreach (var col in _table.Columns.Values)
 | 
			
		||||
//				if (col.Attribute.IsIdentity == false && _ignore.ContainsKey(col.Attribute.Name) == false) {
 | 
			
		||||
//					if (colidx > 0) sbhead.Append(", ");
 | 
			
		||||
//					sbhead.Append(_commonUtils.QuoteSqlName(col.Attribute.Name));
 | 
			
		||||
//					++colidx;
 | 
			
		||||
//				}
 | 
			
		||||
//			sbhead.Append(") VALUES");
 | 
			
		||||
//			var sbh = sbhead.ToString();
 | 
			
		||||
 | 
			
		||||
//			var sbsql = new StringBuilder().Append(sbh);
 | 
			
		||||
//			var sbsqlParams = new List<DbParameter>();
 | 
			
		||||
//			var didx = 0;
 | 
			
		||||
//			foreach (var d in _source) {
 | 
			
		||||
//				if ((didx + 1) * colidx >= 2100) {
 | 
			
		||||
//					ret.Add((sbsql.ToString(), sbsqlParams.ToArray()));
 | 
			
		||||
//					sbsql.Clear().Append(sbh);
 | 
			
		||||
//					sbsqlParams.Clear();
 | 
			
		||||
//					didx = 0;
 | 
			
		||||
//				}
 | 
			
		||||
 | 
			
		||||
//				if (sbsqlParams.Count > 0) sbsql.Append(", ");
 | 
			
		||||
//				sbsql.Append("(");
 | 
			
		||||
//				var colidx2 = 0;
 | 
			
		||||
//				foreach (var col in _table.Columns.Values)
 | 
			
		||||
//					if (col.Attribute.IsIdentity == false && _ignore.ContainsKey(col.Attribute.Name) == false) {
 | 
			
		||||
//						if (colidx2 > 0) sbsql.Append(", ");
 | 
			
		||||
//						sbsql.Append(_commonUtils.QuoteWriteParamter(col.CsType, $"{_commonUtils.QuoteParamterName(col.CsName)}{didx}"));
 | 
			
		||||
//						object val = null;
 | 
			
		||||
//						if (_table.Properties.TryGetValue(col.CsName, out var tryp)) {
 | 
			
		||||
//							val = tryp.GetValue(d);
 | 
			
		||||
//							if (col.Attribute.IsPrimary && (col.CsType == typeof(Guid) || col.CsType == typeof(Guid?))
 | 
			
		||||
//								&& (val == null || (Guid)val == Guid.Empty)) tryp.SetValue(d, val = FreeUtil.NewMongodbId());
 | 
			
		||||
//						}
 | 
			
		||||
//						sbsqlParams.Add(_commonUtils.AppendParamter(null, $"{col.CsName}{didx}", col.CsType, val));
 | 
			
		||||
//						++colidx2;
 | 
			
		||||
//					}
 | 
			
		||||
//				sbsql.Append(")");
 | 
			
		||||
//				++didx;
 | 
			
		||||
//			}
 | 
			
		||||
//			ret.Add((sbsql.ToString(), sbsqlParams.ToArray()));
 | 
			
		||||
//			return ret;
 | 
			
		||||
//		}
 | 
			
		||||
//	}
 | 
			
		||||
//}
 | 
			
		||||
@@ -28,18 +28,21 @@ namespace FreeSql.SqlServer {
 | 
			
		||||
			if (param == null) return "NULL";
 | 
			
		||||
			if (param is bool || param is bool?)
 | 
			
		||||
				return (bool)param ? 1 : 0;
 | 
			
		||||
			else if (param is string || param is Enum)
 | 
			
		||||
			else if (param is string)
 | 
			
		||||
				return string.Concat("'", param.ToString().Replace("'", "''"), "'");
 | 
			
		||||
			else if (param is Enum)
 | 
			
		||||
				return ((Enum)param).ToInt64();
 | 
			
		||||
			else if (decimal.TryParse(string.Concat(param), out var trydec))
 | 
			
		||||
				return param;
 | 
			
		||||
			else if (param is DateTime)
 | 
			
		||||
			else if (param is DateTime || param is DateTime?) {
 | 
			
		||||
				if (param.Equals(DateTime.MinValue) == true) param = new DateTime(1970, 1, 1);
 | 
			
		||||
				return string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.fff"), "'");
 | 
			
		||||
			else if (param is DateTime?)
 | 
			
		||||
				return string.Concat("'", (param as DateTime?).Value.ToString("yyyy-MM-dd HH:mm:ss.fff"), "'");
 | 
			
		||||
			else if (param is TimeSpan)
 | 
			
		||||
			} else if (param is DateTimeOffset || param is DateTimeOffset?) {
 | 
			
		||||
				if (param.Equals(DateTimeOffset.MinValue) == true) param = new DateTimeOffset(new DateTime(1970, 1, 1), TimeSpan.Zero);
 | 
			
		||||
				return string.Concat("'", ((DateTimeOffset)param).ToString("yyyy-MM-dd HH:mm:ss.fff zzzz"), "'");
 | 
			
		||||
			}
 | 
			
		||||
			else if (param is TimeSpan || param is TimeSpan?)
 | 
			
		||||
				return ((TimeSpan)param).TotalSeconds;
 | 
			
		||||
			else if (param is TimeSpan?)
 | 
			
		||||
				return (param as TimeSpan?).Value.TotalSeconds;
 | 
			
		||||
			else if (param is IEnumerable) {
 | 
			
		||||
				var sb = new StringBuilder();
 | 
			
		||||
				var ie = param as IEnumerable;
 | 
			
		||||
 
 | 
			
		||||
@@ -4,6 +4,8 @@ using System.Collections.Generic;
 | 
			
		||||
using System.Data;
 | 
			
		||||
using System.Data.Common;
 | 
			
		||||
using System.Data.SqlClient;
 | 
			
		||||
using System.Linq;
 | 
			
		||||
using System.Text;
 | 
			
		||||
 | 
			
		||||
namespace FreeSql.SqlServer {
 | 
			
		||||
 | 
			
		||||
@@ -42,6 +44,24 @@ namespace FreeSql.SqlServer {
 | 
			
		||||
 | 
			
		||||
		internal override string QuoteWriteParamter(Type type, string paramterName) => paramterName;
 | 
			
		||||
		internal override string QuoteReadColumn(Type type, string columnName) => columnName;
 | 
			
		||||
 | 
			
		||||
		internal override string GetNoneParamaterSqlValue(Type type, object value) {
 | 
			
		||||
			if (value == null) return "NULL";
 | 
			
		||||
			if (type == typeof(byte[])) {
 | 
			
		||||
				var bytes = value as byte[];
 | 
			
		||||
				var sb = new StringBuilder().Append("0x");
 | 
			
		||||
				foreach (var vc in bytes) {
 | 
			
		||||
					if (vc < 10) sb.Append("0");
 | 
			
		||||
					sb.Append(vc.ToString("X"));
 | 
			
		||||
				}
 | 
			
		||||
				return sb.ToString();
 | 
			
		||||
			} else if (type == typeof(TimeSpan) || type == typeof(TimeSpan?)) {
 | 
			
		||||
				var ts = (TimeSpan)value;
 | 
			
		||||
				value = $"{ts.Hours}:{ts.Minutes}:{ts.Seconds}.{ts.Milliseconds}";
 | 
			
		||||
			}
 | 
			
		||||
			return FormatSql("{0}", value, 1);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		internal override string DbName => "SqlServer";
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -34,16 +34,10 @@ namespace FreeSql.Sqlite {
 | 
			
		||||
				return ((Enum)param).ToInt64();
 | 
			
		||||
			else if (decimal.TryParse(string.Concat(param), out var trydec))
 | 
			
		||||
				return param;
 | 
			
		||||
			else if (param is DateTime)
 | 
			
		||||
			else if (param is DateTime || param is DateTime?)
 | 
			
		||||
				return string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss"), "'");
 | 
			
		||||
			else if (param is DateTime?)
 | 
			
		||||
				return string.Concat("'", (param as DateTime?).Value.ToString("yyyy-MM-dd HH:mm:ss"), "'");
 | 
			
		||||
			else if (param is TimeSpan)
 | 
			
		||||
			else if (param is TimeSpan || param is TimeSpan?)
 | 
			
		||||
				return ((TimeSpan)param).Ticks / 10000;
 | 
			
		||||
			else if (param is TimeSpan?)
 | 
			
		||||
				return (param as TimeSpan?).Value.Ticks / 10000;
 | 
			
		||||
			else if (param is MygisGeometry)
 | 
			
		||||
				return (param as MygisGeometry).AsText();
 | 
			
		||||
			else if (param is IEnumerable) {
 | 
			
		||||
				var sb = new StringBuilder();
 | 
			
		||||
				var ie = param as IEnumerable;
 | 
			
		||||
 
 | 
			
		||||
@@ -5,6 +5,7 @@ using System.Collections.Generic;
 | 
			
		||||
using System.Data;
 | 
			
		||||
using System.Data.Common;
 | 
			
		||||
using System.Data.SQLite;
 | 
			
		||||
using System.Text;
 | 
			
		||||
 | 
			
		||||
namespace FreeSql.Sqlite {
 | 
			
		||||
 | 
			
		||||
@@ -61,6 +62,13 @@ namespace FreeSql.Sqlite {
 | 
			
		||||
 | 
			
		||||
		internal override string QuoteWriteParamter(Type type, string paramterName) => paramterName;
 | 
			
		||||
		internal override string QuoteReadColumn(Type type, string columnName) => columnName;
 | 
			
		||||
 | 
			
		||||
		internal override string GetNoneParamaterSqlValue(Type type, object value) {
 | 
			
		||||
			if (value == null) return "NULL";
 | 
			
		||||
			if (type == typeof(byte[])) value = Encoding.UTF8.GetString(value as byte[]);
 | 
			
		||||
			return FormatSql("{0}", value, 1);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		internal override string DbName => "Sqlite";
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user