У меня есть три связанных объекта A
, B
и C
, где A
является родителем B
, а B
является родителем C
.
public class A
{
public int Id { get; set; }
public B B { get; set; }
}
public class B
{
public int Id { get; set; }
public C C { get; set; }
}
public class C
{
public int Id { get; set; }
public string Name { get; set; }
}
Сущности выше имеют свои собственные модели DTO, которые содержат метод FromEntity
и Projection
.
public class ADto
{
public int Id { get; set; }
public BDto BDto { get; set; }
public static Expression<Func<A, ADto>> Projection
{
get
{
return x => new ADto
{
Id = x.Id,
BDto = BDto.FromEntity(x.B)
};
}
}
}
public class BDto
{
public int Id { get; set; }
public CDto CDto { get; set; }
public static Expression<Func<B, BDto>> Projection
{
get
{
return x => new BDto
{
Id = x.Id,
CDto = CDto.FromEntity(x.C)
};
}
}
public static BDto FromEntity(B entity)
{
return Projection.Compile().Invoke(entity);
}
}
public class CDto
{
public int Id { get; set; }
public string Name { get; set; }
public static Expression<Func<C, CDto>> Projection
{
get
{
return x => new CDto
{
Id = x.Id,
Name = x.Name
};
}
}
public static CDto FromEntity(C entity)
{
return Projection.Compile().Invoke(entity);
}
}
Тогда я использую проекцию так:
_context.A.Where(x = x.Id == id).Select(ADto.Projection).FirstOrDefault();
Все мои текущие попытки закончились с исключением в CDto
в FromEntity
методе, потому что сущность нулевая и, следовательно, проекция не может быть вызвана.
System.NullReferenceException: 'Ссылка на объект не установлена для экземпляра объекта.'
Есть ли способ связать больше вложенных проекций?
Я знаю, что могу использовать это:
public class ADto
{
public int Id { get; set; }
public BDto BDto { get; set; }
public static Expression<Func<A, ADto>> Projection
{
get
{
return x => new ADto
{
Id = x.Id,
BDto = new BDto()
{
Id = x.B.Id,
CDto = new CDto()
{
Id = x.B.C.Id,
Name = x.B.C.Name
}
}
};
}
}
}
Но я бы хотел управлять проектированием в одном месте, потому что реальные занятия слишком сложны.