/// <summary> /// 获取指定类型对应的数据源。 /// </summary> /// <param name="entityType">实体类型。</param> /// <param name="throwIfNotFound">未发现元数据时是否抛异常。</param> public DapperDataSource GetDataSource(Type entityType, bool throwIfNotFound = true) { return(_mappedDataSources.GetOrAdd(entityType, et => { DapperMetadata metadata = GetMetadata(et, throwIfNotFound); return GetDataSource(metadata?.ReadingConnectionName, metadata?.WritingConnectionName); })); }
/// <summary> /// 构造函数 /// </summary> /// <param name="dapperContext">dapper上下文</param> /// <param name="loggerFactory">日志组件</param> public DapperRepository(DapperContext dapperContext, ILoggerFactory loggerFactory = null) { Guard.ArgumentNotNull(dapperContext, nameof(dapperContext)); Context = dapperContext; _metadata = dapperContext.Runtime.GetMetadata(typeof(T)); _loggerLazy = new Lazy <ILogger>(() => loggerFactory?.CreateLogger <DapperRepository <T> >() ?? NullLogger <DapperRepository <T> > .Instance); }
/// <summary> /// 根据实体类型获取 Dapper 配置的元数据。 /// </summary> /// <param name="entityType">实体类型。</param> /// <param name="throwIfNotFound">未发现元数据时是否抛异常</param> /// <returns></returns> public DapperMetadata GetMetadata(Type entityType, bool throwIfNotFound = true) { if (_metadataSet.TryGetValue(entityType, out DapperMetadata value)) { return(value); } var convention = _options.Value.GetModelConvention(); var item = convention.TypeConventions.FirstOrDefault(x => x.Filter(entityType)); if (item == null && throwIfNotFound) { throw new InvalidOperationException( $"找不到类型 {entityType.Name} 的元数据提供程序, 请确保已经通过 {typeof(DapperMetadataProvider<>).Name} 或者{typeof(TypeConvention).Name}实现了元数据提供程序。"); } value = new DapperMetadata(entityType, item, convention); _metadataSet.TryAdd(entityType, value); return(value); }
/// <summary> /// 生成插入的SQL语句 /// </summary> /// <param name="entityType">实体类型</param> /// <param name="runtime">Dapper运行时</param> /// <param name="metadata">Dapper元数据</param> /// <returns></returns> private static string GenerateInsertSql(Type entityType, DapperRuntime runtime, DapperMetadata metadata) { var fields = metadata.Fields.Where(f => !f.Ignore && !f.AutoGeneration).OrderBy(x => x.Field.Name).ToArray(); string columns = fields.Select(k => runtime.DelimitIdentifier(entityType, k.Name)).ToArrayString(", "); string parameters = fields.Select(k => $"{runtime.DelimitParameter(entityType, k.Field.Name)}").ToArrayString(", "); StringBuilder sqlBuilder = new StringBuilder(); sqlBuilder.Append("INSERT INTO "); sqlBuilder.Append($"{runtime.DelimitIdentifier(entityType, metadata.TableName)} "); sqlBuilder.Append($"({columns}) "); sqlBuilder.Append(" VALUES "); sqlBuilder.Append($"({parameters})"); return(sqlBuilder.ToString()); }
/// <summary> /// 使用界定符包围T-SQL中的参数字符串。 /// </summary> /// <param name="entityType">实体类型</param> /// <param name="runtime">Dapper运行时</param> /// <param name="metadata">Dapper元数据</param> /// <returns></returns> private static string KeyDelimitSegment(Type entityType, DapperRuntime runtime, DapperMetadata metadata) { return(metadata.Fields.Where(f => f.IsKey).Select(k => $"{runtime.DelimitIdentifier(entityType, k.Name)} = {runtime.DelimitParameter(entityType, k.Field.Name)}").ToArrayString(" AND ")); }
/// <summary> /// 生成查询的SQL语句 /// </summary> /// <param name="entityType">实体类型</param> /// <param name="runtime">Dapper运行时</param> /// <param name="metadata">Dapper元数据</param> /// <returns></returns> private static string GenerateSelectSql(Type entityType, DapperRuntime runtime, DapperMetadata metadata) { string columnsSetSeg = metadata.Fields.Where(f => !f.Ignore).OrderBy(x => x.Field.Name) .Select(k => runtime.DelimitIdentifier(entityType, k.Name)).ToArrayString(", "); StringBuilder sqlBuilder = new StringBuilder(); sqlBuilder.Append("SELECT "); sqlBuilder.Append(columnsSetSeg); sqlBuilder.Append(" FROM "); sqlBuilder.Append($"{runtime.DelimitIdentifier(entityType, metadata.TableName)}"); return(sqlBuilder.ToString()); }
/// <summary> /// 生成删除的SQL语句 /// </summary> /// <param name="entityType">实体类型</param> /// <param name="runtime">Dapper运行时</param> /// <param name="metadata">Dapper元数据</param> /// <returns></returns> private static string GenerateDeleteSql(Type entityType, DapperRuntime runtime, DapperMetadata metadata) { string whereSeg = KeyDelimitSegment(entityType, runtime, metadata); StringBuilder sqlBuilder = new StringBuilder(); sqlBuilder.Append("DELETE FROM "); sqlBuilder.Append($"{runtime.DelimitIdentifier(entityType, metadata.TableName)} "); if (!string.IsNullOrWhiteSpace(whereSeg)) { sqlBuilder.Append(" WHERE "); sqlBuilder.Append(whereSeg); } return(sqlBuilder.ToString()); }
/// <summary> /// 生成更新的SQL语句 /// </summary> /// <param name="entityType">实体类型</param> /// <param name="runtime">Dapper运行时</param> /// <param name="metadata">Dapper元数据</param> /// <returns></returns> private static string GenerateUpdateSql(Type entityType, DapperRuntime runtime, DapperMetadata metadata) { var fields = metadata.Fields.Where(f => !f.IsKey && !f.AutoGeneration && !f.Ignore).OrderBy(x => x.Field.Name).ToArray(); string columnsSetSeg = fields.Select(k => $"{runtime.DelimitIdentifier(entityType, k.Name)} = {runtime.DelimitParameter(entityType, k.Field.Name)}").ToArrayString(", "); string whereSeg = KeyDelimitSegment(entityType, runtime, metadata); StringBuilder sqlBuilder = new StringBuilder(); sqlBuilder.Append("UPDATE "); sqlBuilder.Append($"{runtime.DelimitIdentifier(entityType, metadata.TableName)} "); sqlBuilder.Append("SET "); sqlBuilder.Append(columnsSetSeg); if (!string.IsNullOrWhiteSpace(whereSeg)) { sqlBuilder.Append(" WHERE "); sqlBuilder.Append(whereSeg); } return(sqlBuilder.ToString()); }