public T GetValue<T>(string columnName, string tableAlias = null) { if (ShouldMapClass<T>() || columnName.IsNullOrEmpty()) { return default; } CalculateColumnCache(); var requestedTableNames = GetTableNamesFromAlias(tableAlias); var readerAccessItems = new List<ReaderAccessItem>(); var information = new PreProcessPropertyInformation { ReaderAccessItems = readerAccessItems, Instance = null, RequestedTableNames = requestedTableNames }; CollectOrdinal(null, information, columnName.ToLower()); if (readerAccessItems.Count == 0) { return default; } return ExecuteReaderAccessItem<T>(readerAccessItems.First()); }
private void PreProcessProperties(PreProcessPropertyInformation information) { information.Entity = information.Entity ?? EntityCache.GetEntity(information.Instance.GetType()) ?? TypeAnalyzer.AnalyzeType(information.Instance.GetType()); foreach (var property in information.Entity.GetProperties()) { if (property.IsOwnsOne) { var ownsOneInstance = Activator.CreateInstance(property.Type); property.PropertyInfo.SetValue(information.Instance, ownsOneInstance); PreProcessProperties(new PreProcessPropertyInformation { ReaderAccessItems = information.ReaderAccessItems, Instance = ownsOneInstance, RequestedTableNames = information.RequestedTableNames, ColumnPrefix = property.ColumnName.ToLower() + "_", Entity = property.OwnsOne }); } var columnName = information.ColumnPrefix + property.ColumnName.ToLower(); CollectOrdinal(property, information, columnName); } }
private void CollectOrdinal(MetaData.Models.Property property, PreProcessPropertyInformation information, string columnName) { if (!_tableAnalysisResult.ResultTableNames.Any() || !information.RequestedTableNames.Any()) { // No result analyse result available if (!_tableAnalysisResult.ColumnCache.ContainsKey(columnName)) { var columnNew = _tableAnalysisResult.ColumnCache.Keys.FirstOrDefault(c => c.EndsWith("." + columnName)); if (!columnNew.IsNullOrEmpty()) { columnName = columnNew; } } if (_tableAnalysisResult.ColumnCache.ContainsKey(columnName)) { information.ReaderAccessItems.Add(new ReaderAccessItem { Ordinal = _tableAnalysisResult.ColumnCache[columnName].Last(), Instance = information.Instance, PropertyInfo = property?.PropertyInfo }); } return; } var columnFound = false; foreach (var requestedTableName in information.RequestedTableNames) { var fullColumnNames = requestedTableName.TableNames.Select(tableName => $"{tableName}.{columnName}").ToList(); var fullColumnName = fullColumnNames.FirstOrDefault(f => _tableAnalysisResult.ColumnCache.ContainsKey(f)); if (fullColumnName.IsNullOrEmpty()) { continue; } columnFound = true; if (!_tableAnalysisResult.AliasOccurrences.ContainsKey(requestedTableName.Alias)) { if (requestedTableName.TableNames.Any(t => t == requestedTableName.Alias)) { // Alias is an table name information.ReaderAccessItems.Add(new ReaderAccessItem { Ordinal = _tableAnalysisResult.ColumnCache[fullColumnName].Last(), Instance = information.Instance, PropertyInfo = property?.PropertyInfo }); } // Skip property if alias is unknown continue; } var aliasOccurrence = _tableAnalysisResult.AliasOccurrences[requestedTableName.Alias]; if (aliasOccurrence >= _tableAnalysisResult.ColumnCache[fullColumnName].Count) { // Skip if correct column occurrence could not be found continue; } information.ReaderAccessItems.Add(new ReaderAccessItem { Ordinal = _tableAnalysisResult.ColumnCache[fullColumnName][aliasOccurrence], Instance = information.Instance, PropertyInfo = property?.PropertyInfo }); } if (!columnFound) { var fullColumnName = $"none.{columnName}"; if (_tableAnalysisResult.ColumnCache.ContainsKey(fullColumnName)) { information.ReaderAccessItems.Add(new ReaderAccessItem { Ordinal = _tableAnalysisResult.ColumnCache[fullColumnName].Last(), Instance = information.Instance, PropertyInfo = property?.PropertyInfo }); } } }