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

using System.Reflection;
namespace SparkClient.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;
}
}