You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
74 lines
2.5 KiB
74 lines
2.5 KiB
using System.Reflection; |
|
|
|
namespace BrilliantSightClient.Model.Entity.Base; |
|
|
|
public abstract class BaseEntity |
|
{ |
|
public Guid GUID { get; set; } |
|
public static string TableName => throw new NotImplementedException("Table name is not implemented."); |
|
// 获取字段映射的实际名称 |
|
private static Dictionary<string, string> GetFieldMappings() |
|
{ |
|
var properties = typeof(BaseEntity).GetProperties(BindingFlags.Public | BindingFlags.Instance); |
|
return properties |
|
.Where(p => Attribute.IsDefined(p, typeof(DbFieldAttribute))) |
|
.ToDictionary( |
|
p => p.Name, |
|
p => ((DbFieldAttribute)p.GetCustomAttribute(typeof(DbFieldAttribute))).FieldName |
|
); |
|
} |
|
|
|
// 生成 Insert 语句 |
|
public string GenerateInsertSQL() |
|
{ |
|
var mappings = GetFieldMappings(); |
|
var columns = string.Join(", ", mappings.Values); |
|
var values = string.Join(", ", mappings.Keys.Select(k => $"@{k}")); |
|
return $"INSERT INTO {TableName} ({columns}) VALUES ({values});"; |
|
} |
|
|
|
// 生成 Update 语句 |
|
public string GenerateUpdateSQL(Dictionary<string, object> fieldsToUpdate = null) |
|
{ |
|
if (fieldsToUpdate == null || fieldsToUpdate.Count == 0) |
|
{ |
|
// 默认根据 ID 更新所有字段 |
|
var mappings = GetFieldMappings(); |
|
var setClause = string.Join(", ", mappings.Values.Select(f => $"{f} = @{f}")); |
|
return $"UPDATE {TableName} SET {setClause} WHERE id = @id;"; |
|
} |
|
else |
|
{ |
|
// 根据传入的字段更新 |
|
var setClause = string.Join(", ", fieldsToUpdate.Keys.Select(f => $"{f} = @{f}")); |
|
return $"UPDATE {TableName} SET {setClause} WHERE id = @id;"; |
|
} |
|
} |
|
|
|
// 生成 Delete 语句 |
|
public string GenerateDeleteSQL(Dictionary<string, object> conditions = null) |
|
{ |
|
if (conditions == null || conditions.Count == 0) |
|
{ |
|
// 默认根据 ID 删除 |
|
return $"DELETE FROM {TableName} WHERE id = @id;"; |
|
} |
|
else |
|
{ |
|
// 根据传入条件删除 |
|
var whereClause = string.Join(" AND ", conditions.Keys.Select(f => $"{f} = @{f}")); |
|
return $"DELETE FROM {TableName} WHERE {whereClause};"; |
|
} |
|
} |
|
} |
|
|
|
[AttributeUsage(AttributeTargets.Property)] |
|
public class DbFieldAttribute : Attribute |
|
{ |
|
public string FieldName { get; } |
|
|
|
public DbFieldAttribute(string fieldName) |
|
{ |
|
FieldName = fieldName; |
|
} |
|
}
|
|
|