示例#1
0
		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());
		}
示例#2
0
		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);
			}
		}
示例#3
0
		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
					});
				}
			}
		}