Я пытаюсь создать небольшую утилиту «automapper-esq», которая возьмет сущность LinqToSql и отобразит ее в «классе проекции».
Пока у меня есть что-то вроде этого:
class Entity
{
public int ID { get; set; }
public string WantedProperty { get; set; }
public string UnWantedPropertyData { get; set; }
...More Unwanted Properties...
public IEnumerable<ChildEntity> ChildEntities { get; set; }
}
class EntityProjection
{
public int ID { get; set; }
public string WantedProperty { get; set; }
public IEnumerable<ChildEntityProjection> ChildEntities { get; set; }
}
class ChildEntityProjection
{
public int ID { get; set; }
public string WantedProperty { get; set; }
public string UnWantedPropertyData { get; set; }
...More Unwanted Properties...
}
var results = context.Table.Select(ProjectionHelper.BuildProjection<Entity,EntityProjection>());
, где BuildProjection возвращает:
Expression<Func<TSource, TResult>>
, который, по сути, создает лямбду следующим образом:
A => new EntityProjection() { ID = A.ID, WantedProperty = A.WantedProperty }
Теперь сложная часть ... Я хотел бы также иметь возможность проецировать свойства ассоциации "родительского" объекта. По сути, мне нужно получить что-то вроде этого:
A => new EntityProjection() {
ID = A.ID,
WantedProperty = A.WantedProperty,
ChildEntities = A.ChildEntities.Select(B => new ChildEntityProjection {
ID = B.ID,
WantedProperty = B.WantedProperty
}
}
Я дошел до этой части:
A => new EntityProjection() {
ID = A.ID,
WantedProperty = A.WantedProperty,
ChildEntities = System.Collections.Generic.List1[ChildEntity].Select(B => new ChildEntityProjection {
ID = B.ID,
WantedProperty = B.WantedProperty
}
}
Делая это:
IQueryable<ChildEntity> list = new List<ChildEtity>().AsQueryable();
Expression _selectExpression = Expression.Call(
typeof(Queryable),
"Select",
new Type[] { typeof(ChildEntity), typeof(ChildEntityProjection) },
Expression.Constant(list),
_nestedLambda);
Вот где я застрял в данный момент ... Я немного запутался, пытаясь заменить Expression.Constant (list) другим выражением, которое представляет фактический тип данных для свойства, так что "System.Collections. Generic.List1 [ChildEntity] .Select (B => ... »будет заменен на« A.ChildEntities.Select (B => ... »
Есть идеи?