From bbaf947bb0d62ef6b12f075ac79b4b6ce458abcf Mon Sep 17 00:00:00 2001
From: 2881099 <2881099@qq.com>
Date: Thu, 9 Dec 2021 19:13:15 +0800
Subject: [PATCH] =?UTF-8?q?-=20=E5=A2=9E=E5=8A=A0=20ToDataTableByPropertyN?=
=?UTF-8?q?ame=20=E5=8A=A8=E6=80=81=E6=9F=A5=E8=AF=A2=E5=8A=9F=E8=83=BD?=
=?UTF-8?q?=EF=BC=9B?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
FreeSql.DbContext/FreeSql.DbContext.xml | 9 -
.../Sqlite/Curd/SqliteSelectTest.cs | 5 +
FreeSql/FreeSql.xml | 190 +-----------------
FreeSql/Interface/Curd/ISelect/ISelect0.cs | 6 +
.../SelectProvider/Select0ProviderReader.cs | 19 ++
5 files changed, 37 insertions(+), 192 deletions(-)
diff --git a/FreeSql.DbContext/FreeSql.DbContext.xml b/FreeSql.DbContext/FreeSql.DbContext.xml
index bdd16ff9..da7ace6b 100644
--- a/FreeSql.DbContext/FreeSql.DbContext.xml
+++ b/FreeSql.DbContext/FreeSql.DbContext.xml
@@ -538,14 +538,5 @@
-
-
- 批量注入 Repository,可以参考代码自行调整
-
-
-
-
-
-
diff --git a/FreeSql.Tests/FreeSql.Tests/Sqlite/Curd/SqliteSelectTest.cs b/FreeSql.Tests/FreeSql.Tests/Sqlite/Curd/SqliteSelectTest.cs
index cc17ba19..664d16df 100644
--- a/FreeSql.Tests/FreeSql.Tests/Sqlite/Curd/SqliteSelectTest.cs
+++ b/FreeSql.Tests/FreeSql.Tests/Sqlite/Curd/SqliteSelectTest.cs
@@ -9,6 +9,7 @@ using System.Threading;
using System.Threading.Tasks;
using System.Text;
using Xunit;
+using FreeSql.Internal.CommonProvider;
namespace FreeSql.Tests.Sqlite
{
@@ -149,6 +150,7 @@ namespace FreeSql.Tests.Sqlite
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 });
+ var dt4 = select.Limit(10).ToDataTableByPropertyName(new[] { "a.Id", "a.Type.Name", "Title", "clicks" });
}
class TestDto
{
@@ -368,6 +370,9 @@ namespace FreeSql.Tests.Sqlite
var query = select.LeftJoin(a => a.Type.Guid == a.TypeGuid);
var sql = query.ToSql().Replace("\r\n", "");
Assert.Equal("SELECT a.\"Id\", a.\"Clicks\", a.\"TypeGuid\", a__Type.\"Guid\", a__Type.\"ParentId\", a__Type.\"Name\", a.\"Title\", a.\"CreateTime\" FROM \"tb_topic22\" a LEFT JOIN \"TestTypeInfo\" a__Type ON a__Type.\"Guid\" = a.\"TypeGuid\"", sql);
+ (query as Select0Provider)._tables.Where(a => a.Table.Type == typeof(TestTypeInfo))
+ .First()
+ .Type = SelectTableInfoType.InnerJoin;
query.ToList();
query = select.LeftJoin(a => a.Type.Guid == a.TypeGuid && a.Type.Name == "xxx");
diff --git a/FreeSql/FreeSql.xml b/FreeSql/FreeSql.xml
index c97a0361..87f6f465 100644
--- a/FreeSql/FreeSql.xml
+++ b/FreeSql/FreeSql.xml
@@ -1799,6 +1799,13 @@
+
+
+ 执行SQL查询,返回 properties 指定的实体类属性,并以 DataTable 接收
+
+ 属性名:Name导航属性:Parent.Name多表:b.Name
+
+
以字典的形式返回查询结果
@@ -3179,177 +3186,6 @@
-
-
- 测试数据库是否连接正确,本方法执行如下命令:
- MySql/SqlServer/PostgreSQL/达梦/人大金仓/神通: SELECT 1
- Oracle: SELECT 1 FROM dual
-
- 命令超时设置(秒)
-
- true: 成功, false: 失败
-
-
-
- 查询,若使用读写分离,查询【从库】条件cmdText.StartsWith("SELECT "),否则查询【主库】
-
-
-
-
-
-
-
-
-
- 查询,ExecuteReaderAsync(dr => {}, "select * from user where age > @age", new { age = 25 })
- 提示:parms 参数还可以传 Dictionary<string, object>
-
-
-
-
-
-
-
-
- 查询
-
-
-
-
-
-
-
-
- 查询,ExecuteArrayAsync("select * from user where age > @age", new { age = 25 })
- 提示:parms 参数还可以传 Dictionary<string, object>
-
-
-
-
-
-
-
-
- 查询
-
-
-
-
-
-
-
-
- 查询,ExecuteDataSetAsync("select * from user where age > @age; select 2", new { age = 25 })
- 提示:parms 参数还可以传 Dictionary<string, object>
-
-
-
-
-
-
-
-
- 查询
-
-
-
-
-
-
-
-
- 查询,ExecuteDataTableAsync("select * from user where age > @age", new { age = 25 })
- 提示:parms 参数还可以传 Dictionary<string, object>
-
-
-
-
-
-
-
-
- 在【主库】执行
-
-
-
-
-
-
-
-
- 在【主库】执行,ExecuteNonQueryAsync("delete from user where age > @age", new { age = 25 })
- 提示:parms 参数还可以传 Dictionary<string, object>
-
-
-
-
-
-
-
-
- 在【主库】执行
-
-
-
-
-
-
-
-
- 在【主库】执行,ExecuteScalarAsync("select 1 from user where age > @age", new { age = 25 })
- 提示:parms 参数还可以传 Dictionary<string, object>
-
-
-
-
-
-
-
-
- 执行SQL返回对象集合,QueryAsync<User>("select * from user where age > @age", new SqlParameter { ParameterName = "age", Value = 25 })
-
-
-
-
-
-
-
-
-
-
- 执行SQL返回对象集合,QueryAsync<User>("select * from user where age > @age", new { age = 25 })
- 提示:parms 参数还可以传 Dictionary<string, object>
-
-
-
-
-
-
-
-
-
- 执行SQL返回对象集合,Query<User>("select * from user where age > @age; select * from address", new SqlParameter { ParameterName = "age", Value = 25 })
-
-
-
-
-
-
-
-
-
-
-
- 执行SQL返回对象集合,Query<User, Address>("select * from user where age > @age; select * from address", new { age = 25 })
- 提示:parms 参数还可以传 Dictionary<string, object>
-
-
-
-
-
-
-
-
可自定义解析表达式
@@ -4238,12 +4074,6 @@
超时
-
-
- 获取资源
-
-
-
使用完毕后,归还资源
@@ -4314,12 +4144,6 @@
资源对象
-
-
- 从对象池获取对象成功的时候触发,通过该方法统计或初始化对象
-
- 资源对象
-
归还对象给对象池的时候触发
diff --git a/FreeSql/Interface/Curd/ISelect/ISelect0.cs b/FreeSql/Interface/Curd/ISelect/ISelect0.cs
index d17490da..13020279 100644
--- a/FreeSql/Interface/Curd/ISelect/ISelect0.cs
+++ b/FreeSql/Interface/Curd/ISelect/ISelect0.cs
@@ -72,6 +72,12 @@ namespace FreeSql
///
///
DataTable ToDataTable(string field = null);
+ ///
+ /// 执行SQL查询,返回 properties 指定的实体类属性,并以 DataTable 接收
+ ///
+ /// 属性名:Name导航属性:Parent.Name多表:b.Name
+ ///
+ DataTable ToDataTableByPropertyName(string[] properties);
///
/// 以字典的形式返回查询结果
diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select0ProviderReader.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select0ProviderReader.cs
index 06c59d5c..363cdf44 100644
--- a/FreeSql/Internal/CommonProvider/SelectProvider/Select0ProviderReader.cs
+++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select0ProviderReader.cs
@@ -19,6 +19,25 @@ namespace FreeSql.Internal.CommonProvider
{
partial class Select0Provider
{
+ public DataTable ToDataTableByPropertyName(string[] properties)
+ {
+ if (properties?.Any() != true) throw new ArgumentException($"properties 参数不能为空");
+ var sbfield = new StringBuilder();
+ for (var propIdx = 0; propIdx < properties.Length; propIdx++)
+ {
+ var property = properties[propIdx];
+ var exp = ConvertStringPropertyToExpression(property);
+ if (exp == null) throw new Exception($"{property} 属性名无法找到");
+ var field = _commonExpression.ExpressionSelectColumn_MemberAccess(_tables, null, SelectTableInfoType.From, exp, true, null);
+ if (propIdx > 0) sbfield.Append(", ");
+ sbfield.Append(field);
+ //if (field != property)
+ sbfield.Append(_commonUtils.FieldAsAlias(_commonUtils.QuoteSqlName("test").Replace("test", property)));
+ }
+ var sbfieldStr = sbfield.ToString();
+ sbfield.Clear();
+ return ToDataTable(sbfieldStr);
+ }
public DataTable ToDataTable(string field = null)
{
DataTable ret = null;