using QYZH.InteractiveMagazine.Models.Entity;
using SqlSugar;
using System.Linq.Expressions;
using System.Reflection;
namespace QYZH.InteractiveMagazine.Repository.Core
{
///
/// sql sugar 管理器
///
public static class SqlSugarExtension
{
///
/// 生成类文件
///
///
/// 生成路径
/// 名称空间
public static ISqlSugarClient CreateClassFile(this ISqlSugarClient db, string directoryPath, string nameSpace = "Models")
{
foreach (var item in db.DbMaintenance.GetTableInfoList())
{
string[] entityNameArray = item.Name.Split('_', StringSplitOptions.RemoveEmptyEntries).ToArray();
string entityName = string.Join("", entityNameArray.Select(c => c.ToCamelCase()));
db.MappingTables.Add(entityName, item.Name);
foreach (var col in db.DbMaintenance.GetColumnInfosByTableName(item.Name))
{
var columnNames = col.DbColumnName.ToLower().Split('_', StringSplitOptions.RemoveEmptyEntries).ToArray();
string columnName = string.Join("", columnNames.Select(c => c.ToCamelCase()));
db.MappingColumns.Add(columnName, col.DbColumnName, entityName);
}
}
db.DbFirst.IsCreateAttribute().CreateClassFile(directoryPath, nameSpace);
return db;
}
///
/// 添加全局过滤器
/// IsDeleted
///
/// 数据库Client
/// 程序集名称
///
public static ISqlSugarClient SetQueryFilter(this ISqlSugarClient db, string assemblyName)
{
var assembly = Assembly.Load(assemblyName);
var modelBaseType = typeof(SqlSugarBaseEntity);
var repoBaseType = typeof(SqlSugarBaseEntity);
var types = assembly.ExportedTypes
.Where(t => (modelBaseType.IsAssignableFrom(t) || repoBaseType.IsAssignableFrom(t))
&& t != modelBaseType && t != repoBaseType
&& !t.IsGenericTypeDefinition)
.ToList();
foreach (var entityType in types)
{
var property = entityType.GetProperty("IsDeleted", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.DeclaredOnly);
if (property == null)
{
var baseType = entityType.BaseType;
while (baseType != null && baseType != typeof(object))
{
property = baseType.GetProperty("IsDeleted", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.DeclaredOnly);
if (property != null) break;
baseType = baseType.BaseType;
}
}
if (property == null) continue;
var propertyType = property.PropertyType;
Expression filterExpression;
var param = Expression.Parameter(entityType, "it");
var propertyAccess = Expression.Property(param, property);
if (propertyType == typeof(bool))
{
filterExpression = Expression.Equal(propertyAccess, Expression.Constant(false, typeof(bool)));
}
else if (propertyType == typeof(bool?))
{
filterExpression = Expression.Equal(propertyAccess, Expression.Constant(false, typeof(bool?)));
}
else if (propertyType == typeof(byte))
{
filterExpression = Expression.Equal(propertyAccess, Expression.Constant((byte)0, typeof(byte)));
}
else if (propertyType == typeof(byte?))
{
filterExpression = Expression.Equal(propertyAccess, Expression.Constant((byte)0, typeof(byte?)));
}
else
{
continue;
}
var lambda = Expression.Lambda(filterExpression, param);
db.QueryFilter.AddTableFilter(entityType, lambda);
}
return db;
}
///
/// 添加创建人 创建时间 更新人 更新时间 默认值
///
///
public static ISqlSugarClient SetDefaultValue(this ISqlSugarClient db)
{
#region 创建人 创建时间 更新人 更新时间 默认值
db.Aop.DataExecuting = (oldValue, entityInfo) =>
{
var entityValue = entityInfo.EntityColumnInfo.PropertyInfo.GetValue(entityInfo.EntityValue)?.ToString();
var currnetUserName = "";
/*** inset生效 ***/
if (entityInfo.OperationType == DataFilterType.InsertByObject)
{
if (entityInfo.PropertyName == "CreatedAt" && (string.IsNullOrWhiteSpace(entityValue) || entityValue == DateTime.MinValue.ToString()))
entityInfo.SetValue(DateTime.Now);//修改CreateTime字段
else if (entityInfo.PropertyName == "CreatedBy" && (string.IsNullOrWhiteSpace(entityValue)))
entityInfo.SetValue(currnetUserName);//修改创建人字段
else if (entityInfo.PropertyName == "IsDeleted" && string.IsNullOrWhiteSpace(entityValue))
entityInfo.SetValue("0");//修改CreateTime字段
}
/*** update生效 ***/
if (entityInfo.OperationType == DataFilterType.UpdateByObject)
{
if (entityInfo.PropertyName == "UpdatedAt" && (string.IsNullOrWhiteSpace(entityValue) || entityValue == DateTime.MinValue.ToString()))
entityInfo.SetValue(DateTime.Now);//修改UpdatedTime字段
else if (entityInfo.PropertyName == "UpdatedBy" && (string.IsNullOrWhiteSpace(entityValue) || entityValue == "0"))
entityInfo.SetValue(currnetUserName);//修改更新人字段
}
};
return db;
#endregion
}
///
/// 把一个字符串转成驼峰规则的字符串
///
///
///
public static string ToCamelCase(this string str)
{
if (!string.IsNullOrEmpty(str) && str.Length > 1)
{
return char.ToUpperInvariant(str[0]) + str.Substring(1);
}
return str;
}
}
}