Browse Source

Apewer-6.5.6

dev
王厅 4 years ago
parent
commit
e52d889ff0
  1. 2
      Apewer.Source/Apewer.Source.csproj
  2. 4
      Apewer.Source/Source/DbClient.cs
  3. 20
      Apewer.Source/Source/MySql.cs
  4. 14
      Apewer.Source/Source/SqlClient.cs
  5. 12
      Apewer.Source/Source/SqlClientThin.cs
  6. 16
      Apewer.Source/Source/Sqlite.cs
  7. 2
      Apewer.Web/Apewer.Web.csproj
  8. 2
      Apewer.Windows/Apewer.Windows.csproj
  9. 2
      Apewer/Apewer.csproj
  10. 63
      Apewer/Apewer.props
  11. 18
      Apewer/ArrayBuilder.cs
  12. 14
      Apewer/NetworkUtility.cs
  13. 2
      Apewer/RuntimeUtility.cs
  14. 8
      Apewer/Source/Query.cs
  15. 66
      Apewer/Source/Record.cs
  16. 47
      Apewer/Source/SourceUtility.cs

2
Apewer.Source/Apewer.Source.csproj

@ -1,6 +1,6 @@
<Project Sdk="Microsoft.NET.Sdk">
<Import Project="..\Apewer.props" />
<Import Project="..\Apewer\Apewer.props" />
<PropertyGroup>
<DefineConstants>SOURCE;$(DefineConstants);</DefineConstants>

4
Apewer.Source/Source/DbClient.cs

@ -299,7 +299,7 @@ namespace Apewer.Source
/// <summary>使用指定语句查询,获取查询结果。</summary>
/// <param name="sql">要执行的 SQL 语句。</param>
/// <param name="parameters">为 SQL 语句提供的参数。</param>
public Result<T[]> Query<T>(string sql, IEnumerable<IDataParameter> parameters = null) where T : class, new() => OrmHelper.As<object, T>(Query(typeof(T), sql, parameters));
public Result<T[]> Query<T>(string sql, IEnumerable<IDataParameter> parameters = null) where T : class, new() => SourceUtility.As<object, T>(Query(typeof(T), sql, parameters));
/// <summary>使用指定语句查询,获取查询结果。</summary>
/// <param name="model">目标记录的类型。</param>
@ -318,7 +318,7 @@ namespace Apewer.Source
{
try
{
var array = OrmHelper.Fill(query, model);
var array = SourceUtility.Fill(query, model);
result = new Result<object[]>(array);
}
catch (Exception ex)

20
Apewer.Source/Source/MySql.cs

@ -10,7 +10,7 @@ using System.Net;
using System.Text;
using System.Transactions;
using static Apewer.Source.OrmHelper;
using static Apewer.Source.SourceUtility;
namespace Apewer.Source
{
@ -480,7 +480,7 @@ namespace Apewer.Source
public string Insert(object record, string table = null)
{
if (record == null) return "参数无效。";
OrmHelper.FixProperties(record);
SourceUtility.FixProperties(record);
var structure = TableStructure.Parse(record.GetType());
if (structure == null) return "无法解析记录模型。";
@ -541,7 +541,7 @@ namespace Apewer.Source
}
/// <summary></summary>
public Result<object[]> Query(Type model, string sql, IEnumerable<IDataParameter> parameters = null) => OrmHelper.Query(this, model, sql, parameters);
public Result<object[]> Query(Type model, string sql, IEnumerable<IDataParameter> parameters = null) => SourceUtility.Query(this, model, sql, parameters);
/// <summary></summary>
public Result<T[]> Query<T>(string sql, IEnumerable<IDataParameter> parameters = null) where T : class, new()
@ -556,14 +556,14 @@ namespace Apewer.Source
}
/// <summary>获取所有记录。Flag 为 0 时将忽略 Flag 条件。</summary>
public Result<object[]> Query(Type model, long flag = 0) => OrmHelper.Query(this, model, (tn) =>
public Result<object[]> Query(Type model, long flag = 0) => SourceUtility.Query(this, model, (tn) =>
{
if (flag == 0) return $"select * from `{tn}`; ";
return $"select * from `{tn}` where `_flag`={flag}; ";
});
/// <summary>获取所有记录。Flag 为 0 时将忽略 Flag 条件。</summary>
public Result<T[]> Query<T>(long flag = 0) where T : class, IRecord, new() => OrmHelper.Query<T>(this, (tn) =>
public Result<T[]> Query<T>(long flag = 0) where T : class, IRecord, new() => SourceUtility.Query<T>(this, (tn) =>
{
if (flag == 0) return $"select * from `{tn}`; ";
return $"select * from `{tn}` where `_flag`={flag}; ";
@ -577,7 +577,7 @@ namespace Apewer.Source
{
if (skip < 0) return new Result<object[]>("参数 skip 超出了范围。");
if (count < 1) return new Result<object[]>("参数 count 超出了范围。");
return OrmHelper.Query(this, model, (tn) => $"select * from `{tn}` limit {skip}, {count}; ");
return SourceUtility.Query(this, model, (tn) => $"select * from `{tn}` limit {skip}, {count}; ");
}
/// <summary>获取记录。</summary>
@ -587,25 +587,25 @@ namespace Apewer.Source
{
if (skip < 0) return new Result<T[]>("参数 skip 超出了范围。");
if (count < 1) return new Result<T[]>("参数 count 超出了范围。");
return OrmHelper.Query<T>(this, (tn) => $"select * from `{tn}` limit {skip}, {count}; ");
return SourceUtility.Query<T>(this, (tn) => $"select * from `{tn}` limit {skip}, {count}; ");
}
/// <summary>获取记录。</summary>
public Result<object> Get(Type model, string key, long flag = 0) => OrmHelper.Get(this, model, key, (tn, sk) =>
public Result<object> Get(Type model, string key, long flag = 0) => SourceUtility.Get(this, model, key, (tn, sk) =>
{
if (flag == 0) return $"select * from `{tn}` where `_key`='{sk}' limit 1;";
return $"select * from `{tn}` where `_key`='{sk}' and `_flag`={flag} limit 1;";
});
/// <summary>获取记录。</summary>
public Result<T> Get<T>(string key, long flag = 0) where T : class, IRecord, new() => OrmHelper.Get<T>(this, key, (tn, sk) =>
public Result<T> Get<T>(string key, long flag = 0) where T : class, IRecord, new() => SourceUtility.Get<T>(this, key, (tn, sk) =>
{
if (flag == 0) return $"select * from `{tn}` where `_key`='{sk}' limit 1;";
return $"select * from `{tn}` where `_key`='{sk}' and `_flag`={flag} limit 1;";
});
/// <summary>>获取指定类型的主键,按 Flag 属性筛选。</summary>
public Result<string[]> Keys(Type model, long flag = 0) => OrmHelper.Keys(this, model, (tn) =>
public Result<string[]> Keys(Type model, long flag = 0) => SourceUtility.Keys(this, model, (tn) =>
{
if (flag == 0) return $"select `_key` from `{tn}`;";
return $"select `_key` from `{tn}` where `_flag`={flag};";

14
Apewer.Source/Source/SqlClient.cs

@ -7,7 +7,7 @@ using System.Data;
using System.Data.Common;
using System.Text;
using static Apewer.Source.OrmHelper;
using static Apewer.Source.SourceUtility;
using System.Data.SqlClient;
#if NETFRAMEWORK
@ -560,7 +560,7 @@ namespace Apewer.Source
}
/// <summary>获取按指定语句查询到的所有记录。</summary>
public Result<object[]> Query(Type model, string sql, IEnumerable<IDataParameter> parameters = null) => OrmHelper.Query(this, model, sql, parameters);
public Result<object[]> Query(Type model, string sql, IEnumerable<IDataParameter> parameters = null) => SourceUtility.Query(this, model, sql, parameters);
/// <summary>获取按指定语句查询到的所有记录。</summary>
public Result<T[]> Query<T>(string sql, IEnumerable<IDataParameter> parameters = null) where T : class, new()
@ -575,35 +575,35 @@ namespace Apewer.Source
}
/// <summary>获取记录。</summary>
public Result<object[]> Query(Type model, long flag = 0) => OrmHelper.Query(this, model, (tn) =>
public Result<object[]> Query(Type model, long flag = 0) => SourceUtility.Query(this, model, (tn) =>
{
if (flag == 0) return $"select * from [{tn}]; ";
return $"select * from [{tn}] where _flag={flag}; ";
});
/// <summary>获取记录。</summary>
public Result<T[]> Query<T>(long flag = 0) where T : class, IRecord, new() => OrmHelper.Query<T>(this, (tn) =>
public Result<T[]> Query<T>(long flag = 0) where T : class, IRecord, new() => SourceUtility.Query<T>(this, (tn) =>
{
if (flag == 0) return $"select * from [{tn}]; ";
return $"select * from [{tn}] where _flag={flag}; ";
});
/// <summary>获取具有指定 Key 的记录。</summary>
public Result<object> Get(Type model, string key, long flag = 0) => OrmHelper.Get(this, model, key, (tn, sk) =>
public Result<object> Get(Type model, string key, long flag = 0) => SourceUtility.Get(this, model, key, (tn, sk) =>
{
if (flag == 0) return $"select top 1 * from [{tn}] _key='{sk}'; ";
return $"select top 1 * from [{tn}] where _key='{sk}' and _key='{sk}'; ";
});
/// <summary>获取具有指定 Key 的记录。</summary>
public Result<T> Get<T>(string key, long flag = 0) where T : class, IRecord, new() => OrmHelper.Get<T>(this, key, (tn, sk) =>
public Result<T> Get<T>(string key, long flag = 0) where T : class, IRecord, new() => SourceUtility.Get<T>(this, key, (tn, sk) =>
{
if (flag == 0) return $"select top 1 * from [{tn}] _key='{sk}'; ";
return $"select top 1 * from [{tn}] where _key='{sk}' and _key='{sk}'; ";
});
/// <summary>查询有效的 Key 值。</summary>
public Result<string[]> Keys(Type model, long flag = 0) => OrmHelper.Keys(this, model, (tn) =>
public Result<string[]> Keys(Type model, long flag = 0) => SourceUtility.Keys(this, model, (tn) =>
{
if (flag == 0) return $"select _key from [{tn}]; ";
return $"select _key from [{tn}] where _flag={flag}; ";

12
Apewer.Source/Source/SqlClientThin.cs

@ -9,7 +9,7 @@ using System.Data;
using System.Data.Common;
using System.Text;
using static Apewer.Source.OrmHelper;
using static Apewer.Source.SourceUtility;
using System.Data.SqlClient;
#if NETFRAMEWORK
@ -249,35 +249,35 @@ namespace Apewer.Source
}
/// <summary>获取记录。</summary>
public override Result<object[]> Query(Type model, long flag = 0) => OrmHelper.Query(this, model, (tn) =>
public override Result<object[]> Query(Type model, long flag = 0) => SourceUtility.Query(this, model, (tn) =>
{
if (flag == 0) return $"select * from [{tn}]; ";
return $"select * from [{tn}] where _flag={flag}; ";
});
/// <summary>获取记录。</summary>
public override Result<T[]> Query<T>(long flag = 0) => OrmHelper.Query<T>(this, (tn) =>
public override Result<T[]> Query<T>(long flag = 0) => SourceUtility.Query<T>(this, (tn) =>
{
if (flag == 0) return $"select * from [{tn}]; ";
return $"select * from [{tn}] where _flag={flag}; ";
});
/// <summary>获取具有指定 Key 的记录。</summary>
public override Result<object> Get(Type model, string key, long flag = 0) => OrmHelper.Get(this, model, key, (tn, sk) =>
public override Result<object> Get(Type model, string key, long flag = 0) => SourceUtility.Get(this, model, key, (tn, sk) =>
{
if (flag == 0) return $"select top 1 * from [{tn}] _key='{sk}'; ";
return $"select top 1 * from [{tn}] where _key='{sk}' and _key='{sk}'; ";
});
/// <summary>获取具有指定 Key 的记录。</summary>
public override Result<T> Get<T>(string key, long flag = 0) => OrmHelper.Get<T>(this, key, (tn, sk) =>
public override Result<T> Get<T>(string key, long flag = 0) => SourceUtility.Get<T>(this, key, (tn, sk) =>
{
if (flag == 0) return $"select top 1 * from [{tn}] _key='{sk}'; ";
return $"select top 1 * from [{tn}] where _key='{sk}' and _key='{sk}'; ";
});
/// <summary>查询有效的 Key 值。</summary>
public override Result<string[]> Keys(Type model, long flag = 0) => OrmHelper.Keys(this, model, (tn) =>
public override Result<string[]> Keys(Type model, long flag = 0) => SourceUtility.Keys(this, model, (tn) =>
{
if (flag == 0) return $"select _key from [{tn}]; ";
return $"select _key from [{tn}] where _flag={flag}; ";

16
Apewer.Source/Source/Sqlite.cs

@ -8,7 +8,7 @@ using System.Data.SQLite;
using System.Text;
//using Mono.Data.Sqlite;
using static Apewer.Source.OrmHelper;
using static Apewer.Source.SourceUtility;
namespace Apewer.Source
{
@ -422,7 +422,7 @@ namespace Apewer.Source
public string Insert(object record, string table = null)
{
if (record == null) return "参数无效。";
OrmHelper.FixProperties(record);
SourceUtility.FixProperties(record);
// 解析模型,获取表名。
var structure = TableStructure.Parse(record.GetType());
@ -506,7 +506,7 @@ namespace Apewer.Source
}
/// <summary>获取按指定语句查询到的所有记录。</summary>
public Result<object[]> Query(Type model, string sql, IEnumerable<IDataParameter> parameters = null) => OrmHelper.Query(this, model, sql, parameters);
public Result<object[]> Query(Type model, string sql, IEnumerable<IDataParameter> parameters = null) => SourceUtility.Query(this, model, sql, parameters);
/// <summary>获取按指定语句查询到的所有记录。</summary>
public Result<T[]> Query<T>(string sql, IEnumerable<IDataParameter> parameters = null) where T : class, new()
@ -521,35 +521,35 @@ namespace Apewer.Source
}
/// <summary>查询多条记录。</summary>
public Result<object[]> Query(Type model, long flag = 0) => OrmHelper.Query(this, model, (tn) =>
public Result<object[]> Query(Type model, long flag = 0) => SourceUtility.Query(this, model, (tn) =>
{
if (flag == 0) return $"select * from [{tn}]; ";
return $"select * from [{tn}] where _flag={flag}; ";
});
/// <summary>查询多条记录。</summary>
public Result<T[]> Query<T>(long flag = 0) where T : class, IRecord, new() => OrmHelper.Query<T>(this, (tn) =>
public Result<T[]> Query<T>(long flag = 0) where T : class, IRecord, new() => SourceUtility.Query<T>(this, (tn) =>
{
if (flag == 0) return $"select * from [{tn}]; ";
return $"select * from [{tn}] where _flag={flag}; ";
});
/// <summary>获取具有指定 Key 的记录。</summary>
public Result<object> Get(Type model, string key, long flag = 0) => OrmHelper.Get(this, model, key, (tn, sk) =>
public Result<object> Get(Type model, string key, long flag = 0) => SourceUtility.Get(this, model, key, (tn, sk) =>
{
if (flag == 0) return $"select * from [{tn}] where _key='{sk}' limit 1; ";
return $"select * from [{tn}] where _flag={flag} and _key='{sk}' limit 1; ";
});
/// <summary>获取具有指定 Key 的记录。</summary>
public Result<T> Get<T>(string key, long flag) where T : class, IRecord, new() => OrmHelper.Get<T>(this, key, (tn, sk) =>
public Result<T> Get<T>(string key, long flag) where T : class, IRecord, new() => SourceUtility.Get<T>(this, key, (tn, sk) =>
{
if (flag == 0) return $"select * from [{tn}] where _key='{sk}' limit 1; ";
return $"select * from [{tn}] where _flag={flag} and _key='{sk}' limit 1; ";
});
/// <summary>获取指定类型的主键,按 Flag 属性筛选。</summary>
public Result<string[]> Keys(Type model, long flag = 0) => OrmHelper.Keys(this, model, (tn) =>
public Result<string[]> Keys(Type model, long flag = 0) => SourceUtility.Keys(this, model, (tn) =>
{
if (flag == 0) return $"select _key from [{tn}] where _flag={flag}; ";
return $"select _key from [{tn}]; ";

2
Apewer.Web/Apewer.Web.csproj

@ -1,6 +1,6 @@
<Project Sdk="Microsoft.NET.Sdk">
<Import Project="..\Apewer.props" />
<Import Project="..\Apewer\Apewer.props" />
<PropertyGroup>
<DefineConstants>WEB;$(DefineConstants);</DefineConstants>

2
Apewer.Windows/Apewer.Windows.csproj

@ -1,6 +1,6 @@
<Project Sdk="Microsoft.NET.Sdk">
<Import Project="..\Apewer.props" />
<Import Project="..\Apewer\Apewer.props" />
<PropertyGroup>
<NoWarn>CS0108;CS0612</NoWarn>

2
Apewer/Apewer.csproj

@ -1,6 +1,6 @@
<Project Sdk="Microsoft.NET.Sdk">
<Import Project="..\Apewer.props" />
<Import Project="..\Apewer\Apewer.props" />
<PropertyGroup>
<TargetFrameworks>netstandard2.1;netstandard2.0;netcoreapp3.1;net461;net40;net20</TargetFrameworks>

63
Apewer/Apewer.props

@ -0,0 +1,63 @@
<Project>
<!-- <Import Sdk="Microsoft.NET.Sdk" Project="Sdk.props" /> -->
<!-- 程序集信息 -->
<PropertyGroup>
<Company>Apewer Lab</Company>
<Copyright>Copyright Apewer Lab. All rights reserved.</Copyright>
<Description></Description>
<RootNamespace>Apewer</RootNamespace>
<Product>Apewer Libraries</Product>
<Version>6.5.7</Version>
</PropertyGroup>
<!-- 生成 -->
<PropertyGroup>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<LangVersion>latest</LangVersion>
</PropertyGroup>
<!-- 打包 -->
<PropertyGroup Condition="'$(Configuration)' == 'Release'">
<DebugType>none</DebugType>
<DocumentationFile>bin\$(Configuration)\$(TargetFramework)\$(AssemblyName).xml</DocumentationFile>
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
<IsPackable>true</IsPackable>
<PackageOutputPath>..\</PackageOutputPath>
</PropertyGroup>
<!-- 程序集名称 -->
<PropertyGroup>
<AssemblyTitle Condition="'$(TargetFramework)' == 'net6.0'">$(AssemblyName) - .NET 6</AssemblyTitle>
<AssemblyTitle Condition="'$(TargetFramework)' == 'netcoreapp3.1'">$(AssemblyName) - .NET Core 3.1</AssemblyTitle>
<AssemblyTitle Condition="'$(TargetFramework)' == 'netstandard2.1'">$(AssemblyName) - .NET Standard 2.1</AssemblyTitle>
<AssemblyTitle Condition="'$(TargetFramework)' == 'netstandard2.0'">$(AssemblyName) - .NET Standard 2.0</AssemblyTitle>
<AssemblyTitle Condition="'$(TargetFramework)' == 'net461'">$(AssemblyName) - .NET Framework 4.6.1</AssemblyTitle>
<AssemblyTitle Condition="'$(TargetFramework)' == 'net40'">$(AssemblyName) - .NET Framework 4.0</AssemblyTitle>
<AssemblyTitle Condition="'$(TargetFramework)' == 'net20'">$(AssemblyName) - .NET Framework 2.0</AssemblyTitle>
</PropertyGroup>
<!-- 条件编译 -->
<PropertyGroup>
<DefineConstants Condition="'$(TargetFramework)' == 'net6.0'">NETCORE;NET6;$(DefineConstants);$(AdditionalConstants)</DefineConstants>
<DefineConstants Condition="'$(TargetFramework)' == 'netcoreapp3.1'">NETCORE;$(DefineConstants);$(AdditionalConstants)</DefineConstants>
<DefineConstants Condition="'$(TargetFramework)' == 'netstandard2.1'">NETSTD;$(DefineConstants);$(AdditionalConstants)</DefineConstants>
<DefineConstants Condition="'$(TargetFramework)' == 'netstandard2.0'">NETSTD;$(DefineConstants);$(AdditionalConstants)</DefineConstants>
<DefineConstants Condition="'$(TargetFramework)' == 'net461'">NETFX;NET461;NET45;$(DefineConstants);$(AdditionalConstants)</DefineConstants>
<DefineConstants Condition="'$(TargetFramework)' == 'net40'">NETFX;NET40;$(DefineConstants);$(AdditionalConstants)</DefineConstants>
<DefineConstants Condition="'$(TargetFramework)' == 'net20'">NETFX;NET20;$(DefineConstants);$(AdditionalConstants)</DefineConstants>
</PropertyGroup>
<!-- Visual Studio 2022 -->
<!--
<ItemGroup>
<PackageReference Condition="'$(TargetFramework)'=='net461'" Include="Microsoft.NETFramework.ReferenceAssemblies.net461" Version="1.0.2" PrivateAssets="all" />
<PackageReference Condition="'$(TargetFramework)'=='net40'" Include="Microsoft.NETFramework.ReferenceAssemblies.net40" Version="1.0.2" PrivateAssets="all" />
<PackageReference Condition="'$(TargetFramework)'=='net20'" Include="Microsoft.NETFramework.ReferenceAssemblies.net20" Version="1.0.2" PrivateAssets="all" />
</ItemGroup>
-->
<!-- <Import Sdk="Microsoft.NET.Sdk" Project="Sdk.targets" /> -->
</Project>

18
Apewer/ArrayBuilder.cs

@ -60,6 +60,24 @@ namespace Apewer
/// <summary>当前的元素数量。</summary>
public int Count { get => _count; }
/// <summary>指定元素在数组中的偏移位置。</summary>
public int IndexOf(T value)
{
var array = _array;
var length = _count;
if (length < 1) return -1;
for (var i = 0; i < length; i++)
{
var item = array[i];
if (item == null) continue;
if (item.Equals(value)) return i;
}
return -1;
}
/// <summary>已包含指定的元素。</summary>
public bool Contains(T value) => IndexOf(value) > -1;
/// <summary>添加元素。</summary>
public void Add(T item)
{

14
Apewer/NetworkUtility.cs

@ -383,7 +383,7 @@ namespace Apewer
#region Port
private static List<int> ListActivePort(IPEndPoint[] endpoints)
private static int[] ListActivePort(IPEndPoint[] endpoints)
{
var list = new List<int>(endpoints.Length);
foreach (var endpoint in endpoints)
@ -394,20 +394,14 @@ namespace Apewer
}
list.Sort();
list.Capacity = list.Count;
return list;
return list.ToArray();
}
/// <summary>列出活动的 TCP 端口。</summary>
public static List<int> ListActiveTcpPort()
{
return ListActivePort(IPGlobalProperties.GetIPGlobalProperties().GetActiveTcpListeners());
}
public static int[] ListActiveTcpPort() => ListActivePort(IPGlobalProperties.GetIPGlobalProperties().GetActiveTcpListeners());
/// <summary>列出活动的 UDP 端口。</summary>
public static List<int> ListActiveUdpPort()
{
return ListActivePort(IPGlobalProperties.GetIPGlobalProperties().GetActiveUdpListeners());
}
public static int[] ListActiveUdpPort() => ListActivePort(IPGlobalProperties.GetIPGlobalProperties().GetActiveUdpListeners());
#endregion

2
Apewer/RuntimeUtility.cs

@ -534,7 +534,7 @@ namespace Apewer
/// <param name="background">设置线程为后台线程。</param>
/// <param name="try">忽略 Action 抛出的异常。</param>
/// <remarks>对返回的 Thread 调用 Abort 可结束线程的执行。</remarks>
public static Thread StartThread(Action action, bool background = true, bool @try = false)
public static Thread StartThread(Action action, bool background = false, bool @try = false)
{
if (action == null) return null;
var thread = new Thread(new ThreadStart(() => Invoke(action, @try)));

8
Apewer/Source/Query.cs

@ -225,18 +225,18 @@ namespace Apewer.Source
}
/// <summary>获取指定列的所有值,无效值不加入结果。</summary>
public T[] ReadColumn<T>(int column = 0, Func<object, T> formatter = null) => OrmHelper.Column(this, (r) => (formatter ?? GetValueFormatter<T>()).Invoke(Value(r, column)));
public T[] ReadColumn<T>(int column = 0, Func<object, T> formatter = null) => SourceUtility.Column(this, (r) => (formatter ?? GetValueFormatter<T>()).Invoke(Value(r, column)));
/// <summary>获取指定列的所有值,无效值不加入结果。</summary>
/// <exception cref="ArgumentNullException"></exception>
public T[] ReadColumn<T>(string column, Func<object, T> formatter = null) => OrmHelper.Column(this, (r) => (formatter ?? GetValueFormatter<T>()).Invoke(Value(r, column)));
public T[] ReadColumn<T>(string column, Func<object, T> formatter = null) => SourceUtility.Column(this, (r) => (formatter ?? GetValueFormatter<T>()).Invoke(Value(r, column)));
/// <summary>获取指定列的所有值,无效值不加入结果。</summary>
public string[] ReadColumn(int column = 0) => OrmHelper.Column(this, (r) => this.Text(r, column));
public string[] ReadColumn(int column = 0) => SourceUtility.Column(this, (r) => this.Text(r, column));
/// <summary>获取指定列的所有值,无效值不加入结果。</summary>
/// <exception cref="ArgumentNullException"></exception>
public string[] ReadColumn(string column) => OrmHelper.Column(this, (r) => this.Text(r, column));
public string[] ReadColumn(string column) => SourceUtility.Column(this, (r) => this.Text(r, column));
#endregion

66
Apewer/Source/Record.cs

@ -14,82 +14,34 @@ namespace Apewer.Source
public abstract class Record : IRecord
{
const int KeyLength = 32;
private string _key = null;
private long _flag = 0;
/// <summary>记录主键,一般使用 GUID 的字符串形式。</summary>
/// <remarks>
/// <para>注:</para>
/// <para>1. 默认长度为 32,需要修改长度时应该重写此属性;</para>
/// <para>2. 带有 Independent 特性的模型不包含此属性。</para>
/// </remarks>
[Column("_key", ColumnType.NVarChar, KeyLength)]
public virtual string Key { get { return _key; } set { _key = Compact(value, KeyLength); } }
[Column("_key", ColumnType.NVarChar, 32)]
public virtual string Key { get; set; }
/// <summary>记录的标记,Int64 类型,区分记录的状态。</summary>
/// <remarks>带有 Independent 特性的模型不包含此属性。</remarks>
[Column("_flag", ColumnType.Integer)]
public long Flag { get { return _flag; } set { _flag = value; } }
public virtual long Flag { get; set; }
/// <summary>重置 Key 属性的值。</summary>
public virtual void ResetKey() => Key = TextUtility.Key();
/// <summary></summary>
public Record() => ResetKey();
#region static
/// <summary>枚举带有 Table 特性的 <typeparamref name="T"/> 派生类型。</summary>
public static List<Type> EnumerateTableTypes<T>() where T : IRecord => EnumerateTableTypes(typeof(T));
/// <summary>枚举带有 Table 特性的派生类型。</summary>
public static List<Type> EnumerateTableTypes(Type baseType)
public Record()
{
if (baseType == null) return new List<Type>();
var assemblies = AppDomain.CurrentDomain.GetAssemblies();
var list = new List<Type>();
foreach (var a in assemblies)
{
var types = RuntimeUtility.GetTypes(a);
foreach (var t in types)
{
if (!EnumerateTableTypes(t, baseType)) continue;
if (list.Contains(t)) continue;
list.Add(t);
}
}
return list;
ResetKey();
Flag = DefaultFlag;
}
private static bool EnumerateTableTypes(Type type, Type @base)
{
if (type == null || @base == null) return false;
if (!type.IsAbstract)
{
if (RuntimeUtility.Contains<TableAttribute>(type, false))
{
if (type.Equals(@base))
{
return true;
}
else
{
if (RuntimeUtility.IsInherits(type, @base)) return true; ;
}
}
}
return false;
}
#region static
// 限制文本长度,并去除两边的空白字符。
static string Compact(string text, int length = -1)
{
if (string.IsNullOrEmpty(text)) return "";
if (length > 0 && text.Length > length) text = text.Substring(0, length);
return text.Trim();
}
/// <summary>创建 Record 对象时的默认 Flag 值。</summary>
public static long DefaultFlag { get; set; }
#endregion

47
Apewer/Source/OrmHelper.cs → Apewer/Source/SourceUtility.cs

@ -9,7 +9,7 @@ namespace Apewer.Source
{
/// <summary>ORM 帮助程序。</summary>
public static class OrmHelper
public static class SourceUtility
{
#region As
@ -319,18 +319,6 @@ namespace Apewer.Source
var tableName = tableStructure.Name;
if (string.IsNullOrEmpty(tableName)) return new Result<string[]>("表名无效。");
// var keyName = null as string;
// foreach (var column in tableStructure.Columns)
// {
// if (column.Key == "Key")
// {
// keyName = column.Value.Field;
// break;
// }
// }
// if (string.IsNullOrEmpty(keyName)) return Result<List<string>>.Error("主键字段无效。");
// var sql = sqlGetter(tableName, keyName);
var sql = sqlGetter(tableName);
var query = null as IQuery;
try
@ -413,6 +401,39 @@ namespace Apewer.Source
return setted;
}
/// <summary>枚举带有 Table 特性的 <typeparamref name="T"/> 派生类型。</summary>
public static Type[] EnumerateRecords<T>() where T : IRecord => EnumerateRecords(typeof(T));
/// <summary>枚举带有 Table 特性的派生类型。</summary>
/// <exception cref="ArgumentNullException"></exception>
public static Type[] EnumerateRecords(Type baseType)
{
if (baseType == null) throw new ArgumentNullException(nameof(baseType));
var assemblies = AppDomain.CurrentDomain.GetAssemblies();
var builder = new ArrayBuilder<Type>();
foreach (var assembly in assemblies)
{
var types = RuntimeUtility.GetTypes(assembly);
foreach (var type in types)
{
if (!EnumerateRecords(type, baseType)) continue;
if (builder.Contains(type)) continue;
builder.Add(type);
}
}
return builder.Export();
}
static bool EnumerateRecords(Type type, Type @base)
{
if (type == null || @base == null) return false;
if (type.IsAbstract) return false;
if (!RuntimeUtility.Contains<TableAttribute>(type, false)) return false;
if (type.Equals(@base)) return true;
if (RuntimeUtility.IsInherits(type, @base)) return true;
return false;
}
#endregion
}
Loading…
Cancel
Save