using System;
using [Link];
using [Link];
using [Link];
using [Link];
namespace [Link]
{
public class Nested
{
private static Dictionary<String, Type> _entitiesList = new
Dictionary<String, Type>();
public static void AddEntities<T>() where T : class, new()
{
var entityType = typeof(T);
if (!_entitiesList.ContainsKey([Link]))
_entitiesList.Add([Link], entityType);
}
public NestedEntities BuildNestedEntities(NestedLines nestedLines, String
entityName, NestedEntity parent, int level = 1)
{
var nestedEntities = new NestedEntities();
foreach (var line in [Link])
{
var idField = [Link](entityName, level);
if (idField == null || !_entitiesList.ContainsKey(entityName))
continue;
var entityType = _entitiesList[entityName];
NestedEntity nestedEntity = new
NestedEntity([Link](), entityName, entityType);
[Link]([Link](x =>
[Link] == level + 1).ToList());
if (parent != null) [Link]([Link],
nestedEntity);
var fieldsByEntity = [Link](level + 1);
foreach (var item in fieldsByEntity)
{
if (!_entitiesList.ContainsKey([Link])) continue;
BuildNestedEntities(new NestedLines(new List<NestedLine> { new
NestedLine([Link]()) }), [Link], nestedEntity, level + 1);
}
[Link](nestedEntity);
}
return nestedEntities;
}
public List<object> BuildEntities(NestedEntities entities)
{
List<object> returnEntities = new List<object>();
foreach (var nestedEntity in [Link])
{
var entity = [Link]([Link]);
var properties = [Link]();
foreach (var field in [Link])
{
var currentProp = [Link](x =>
[Link]([Link](), [Link]));
if (currentProp == null) continue;
if ([Link] != [Link]) continue;
[Link](entity, [Link]);
}
foreach (var child in [Link])
{
var childProperty = [Link](x =>
[Link]([Link], [Link]));
if (childProperty is null) continue;
if
([Link]().Contains(typeof(IEnumerable)))
{
var genericArgumentGuid =
[Link]().First().GUID;
if (genericArgumentGuid != [Link])
continue;
var childEntities = BuildEntities(new
NestedEntities().Add([Link]));
object instance =
[Link]([Link]);
IList list = (IList)instance;
foreach (var item in childEntities)
{
[Link](item);
}
[Link](entity, list);
}
else
{
[Link](entity, BuildEntities(new
NestedEntities().Add([Link])).FirstOrDefault());
}
}
[Link](entity);
}
return returnEntities;
}
}
public class NestedLine
{
private readonly List<NestedField> _fields;
public List<NestedField> Fields => _fields;
public NestedLine(List<NestedField> fields)
{
_fields = fields;
}
public static NestedLine FillFields(DbDataReader reader)
{
List<NestedField> fields = new List<NestedField>();
for (int i = 0; i < [Link]; i++)
{
var currentField = new NestedField(
[Link](i),
[Link](i),
[Link](i));
[Link](currentField);
}
return new NestedLine(fields);
}
public NestedField GetId(String entityName, int level)
{
return [Link](x => [Link][level] == "Id" && [Link][level - 1] ==
entityName);
}
/// <summary>
/// Start from 1
/// </summary>
/// <param name="level"></param>
/// <returns></returns>
public List<NestedField> FieldsByLevel(int level)
{
return _fields
.Where(x => [Link] <= level)
.ToList();
}
public String LevelName(int level)
{
return _fields
.Where(x => [Link] >= level)
.Select(x => [Link][level - 1])
.First();
}
public IEnumerable<IGrouping<String, NestedField>> GroupFieldsByEntity(int
level)
{
return _fields.GroupBy(x => [Link][level - 1]);
}
}
public class NestedQuery
{
public NestedLines BuildEntities(DbDataReader reader)
{
List<NestedLine> lines = new List<NestedLine>();
while ([Link]())
{
var line = [Link](reader);
[Link](line);
}
return new NestedLines(lines);
}
}
public class NestedLines
{
private readonly List<NestedLine> _lines;
public NestedLines(List<NestedLine> lines)
{
_lines = lines;
}
public List<NestedLine> Lines => _lines;
public NestedField GetId(String entityName, int level, NestedLine line)
{
return [Link](x => [Link][level] == "Id" && [Link][level - 1]
== entityName);
}
}
public class NestedEntities
{
readonly List<NestedEntity> _entities = new List<NestedEntity>();
public List<NestedEntity> Entities => _entities;
public NestedEntities Add(NestedEntity entity)
{
_entities.Add(entity);
return this;
}
}
public class NestedEntity
{
public NestedEntity(String id, string entityName, Type entityType)
{
Id = id;
EntityName = entityName;
EntityType = entityType;
Childs = new Dictionary<String, NestedEntity>();
NestedFields = new List<NestedField>();
}
public String Id { get; set; }
public String EntityName { get; set; }
public Type EntityType { get; set; }
public List<NestedField> NestedFields { get; set; }
public Dictionary<String, NestedEntity> Childs { get; set; }
internal void AddChild(string entityName, NestedEntity nestedEntity)
{
[Link](entityName, nestedEntity);
}
}
public class NestedField
{
public NestedField(string name, Type type, object value)
{
Name = [Link](new[] { '.' },
[Link]);
Type = type;
Value = value;
}
public String[] Name { get; set; }
public Type Type { get; set; }
public object Value { get; set; }
public String PropertyName()
{
return Name[[Link] - 1];
}
}
}