aboutsummaryrefslogtreecommitdiff
path: root/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/TableInfo.cs
diff options
context:
space:
mode:
authorcrupest <crupest@outlook.com>2022-12-12 20:30:55 +0800
committercrupest <crupest@outlook.com>2022-12-20 20:32:53 +0800
commitd8f12e14f3cebd759a8ee911cabb9585063606cb (patch)
tree5612df6f003faeb2b39c063c7fb3b09c7acb7e4a /docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/TableInfo.cs
parentce8adb2c5ff7d71592a4173eb06391b01cc45f22 (diff)
downloadcrupest-d8f12e14f3cebd759a8ee911cabb9585063606cb.tar.gz
crupest-d8f12e14f3cebd759a8ee911cabb9585063606cb.tar.bz2
crupest-d8f12e14f3cebd759a8ee911cabb9585063606cb.zip
Develop secret api. v31
Diffstat (limited to 'docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/TableInfo.cs')
-rw-r--r--docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/TableInfo.cs57
1 files changed, 28 insertions, 29 deletions
diff --git a/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/TableInfo.cs b/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/TableInfo.cs
index 58a4396..b511b68 100644
--- a/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/TableInfo.cs
+++ b/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/TableInfo.cs
@@ -5,6 +5,9 @@ using Dapper;
namespace CrupestApi.Commons.Crud;
+/// <summary>
+/// Contains all you need to manipulate a table.
+/// </summary>
public class TableInfo
{
private readonly IColumnTypeProvider _columnTypeProvider;
@@ -30,7 +33,6 @@ public class TableInfo
ColumnInfo? primaryKeyColumn = null;
ColumnInfo? keyColumn = null;
- List<PropertyInfo> columnProperties = new();
List<PropertyInfo> nonColumnProperties = new();
foreach (var property in properties)
@@ -55,7 +57,6 @@ public class TableInfo
}
keyColumn = columnInfo;
}
- columnProperties.Add(property);
}
else
{
@@ -75,15 +76,14 @@ public class TableInfo
keyColumn = primaryKeyColumn;
}
- ColumnInfos = columnInfos;
+ Columns = columnInfos;
PrimaryKeyColumn = primaryKeyColumn;
KeyColumn = keyColumn;
- ColumnProperties = columnProperties;
NonColumnProperties = nonColumnProperties;
CheckValidity();
- _lazyColumnNameList = new Lazy<List<string>>(() => ColumnInfos.Select(c => c.ColumnName).ToList());
+ _lazyColumnNameList = new Lazy<List<string>>(() => Columns.Select(c => c.ColumnName).ToList());
}
private ColumnInfo CreateAutoIdColumn()
@@ -101,14 +101,15 @@ public class TableInfo
public Type EntityType { get; }
public string TableName { get; }
- public IReadOnlyList<ColumnInfo> ColumnInfos { get; }
+ public IReadOnlyList<ColumnInfo> Columns { get; }
+ public IReadOnlyList<ColumnInfo> PropertyColumns => Columns.Where(c => c.PropertyInfo is not null).ToList();
public ColumnInfo PrimaryKeyColumn { get; }
/// <summary>
/// Maybe not the primary key. But acts as primary key.
/// </summary>
/// <seealso cref="ColumnMetadataKeys.ActAsKey"/>
public ColumnInfo KeyColumn { get; }
- public IReadOnlyList<PropertyInfo> ColumnProperties { get; }
+ public IReadOnlyList<PropertyInfo> ColumnProperties => PropertyColumns.Select(c => c.PropertyInfo!).ToList();
public IReadOnlyList<PropertyInfo> NonColumnProperties { get; }
public IReadOnlyList<string> ColumnNameList => _lazyColumnNameList.Value;
@@ -121,7 +122,7 @@ public class TableInfo
public ColumnInfo GetColumn(string columnName)
{
- foreach (var column in ColumnInfos)
+ foreach (var column in Columns)
{
if (column.ColumnName.Equals(columnName, StringComparison.OrdinalIgnoreCase))
{
@@ -136,7 +137,7 @@ public class TableInfo
// Check if there is only one primary key.
bool hasPrimaryKey = false;
bool hasKey = false;
- foreach (var column in ColumnInfos)
+ foreach (var column in Columns)
{
if (column.IsPrimaryKey)
{
@@ -155,7 +156,7 @@ public class TableInfo
// Check two columns have the same sql name.
HashSet<string> sqlNameSet = new HashSet<string>();
- foreach (var column in ColumnInfos)
+ foreach (var column in Columns)
{
if (sqlNameSet.Contains(column.ColumnName))
throw new Exception($"Two columns have the same sql name '{column.ColumnName}'.");
@@ -167,7 +168,7 @@ public class TableInfo
{
var sb = new StringBuilder();
- foreach (var column in ColumnInfos)
+ foreach (var column in Columns)
{
if (column.Index == ColumnIndexType.None) continue;
@@ -180,7 +181,7 @@ public class TableInfo
public string GenerateCreateTableSql(bool createIndex = true, string? dbProviderId = null)
{
var tableName = TableName;
- var columnSql = string.Join(",\n", ColumnInfos.Select(c => c.GenerateCreateTableColumnString(dbProviderId)));
+ var columnSql = string.Join(",\n", Columns.Select(c => c.GenerateCreateTableColumnString(dbProviderId)));
var sql = $@"
CREATE TABLE {tableName}(
@@ -286,7 +287,7 @@ CREATE TABLE {tableName}(
public void CheckInsertClause(IInsertClause insertClause)
{
- var columnNameSet = new HashSet<string>(ColumnInfos.Select(c => c.ColumnName));
+ var columnNameSet = new HashSet<string>(Columns.Select(c => c.ColumnName));
foreach (var item in insertClause.Items)
{
@@ -419,7 +420,7 @@ CREATE TABLE {tableName}(
return queryResult.Select(d =>
{
Type dynamicType = d.GetType();
- foreach (var column in ColumnInfos)
+ foreach (var column in Columns)
{
object? value = null;
var dynamicProperty = dynamicType.GetProperty(column.ColumnName);
@@ -437,9 +438,9 @@ CREATE TABLE {tableName}(
column.Hooks.AfterSelect(column, ref value);
}
- if (dynamicProperty is not null && value is not null)
+ if (dynamicProperty is not null)
{
- if (value is DbNullValue)
+ if (value is null || value is DbNullValue)
dynamicProperty.SetValue(d, null);
else
dynamicProperty.SetValue(d, value);
@@ -464,7 +465,7 @@ CREATE TABLE {tableName}(
Type dynamicType = d.GetType();
Type resultType = typeof(TResult);
- foreach (var column in ColumnInfos)
+ foreach (var column in Columns)
{
var dynamicProperty = dynamicType.GetProperty(column.ColumnName);
// TODO: Maybe we can do better to get result property in case ColumnName is set to another value.
@@ -498,28 +499,26 @@ CREATE TABLE {tableName}(
var realInsert = InsertClause.Create();
- foreach (var column in ColumnInfos)
+ foreach (var column in Columns)
{
InsertItem? item = insert.Items.SingleOrDefault(i => i.ColumnName == column.ColumnName);
if (item is null)
{
object? value = null;
column.Hooks.BeforeInsert(column, ref value);
- if (value is not null)
- if (value is DbNullValue)
- realInsert.Add(column.ColumnName, null);
- else
- realInsert.Add(column.ColumnName, value);
+ if (value is null || value is DbNullValue)
+ realInsert.Add(column.ColumnName, null);
+ else
+ realInsert.Add(column.ColumnName, value);
}
else
{
object? value = item.Value ?? DbNullValue.Instance;
column.Hooks.BeforeInsert(column, ref value);
- if (value is not null)
- if (value is DbNullValue)
- realInsert.Add(column.ColumnName, null);
- else
- realInsert.Add(column.ColumnName, value);
+ if (value is null || value is DbNullValue)
+ realInsert.Add(column.ColumnName, null);
+ else
+ realInsert.Add(column.ColumnName, value);
}
if (item?.ColumnName == KeyColumn.ColumnName)
@@ -543,7 +542,7 @@ CREATE TABLE {tableName}(
{
var realUpdate = UpdateClause.Create();
- foreach (var column in ColumnInfos)
+ foreach (var column in Columns)
{
UpdateItem? item = update.Items.FirstOrDefault(i => i.ColumnName == column.ColumnName);