Эй, ребята, у нас есть сценарий в виде дерева (на самом деле мы используем только два уровня, но теоретически он может иметь несколько уровней листьев).
Объект довольно сложный, поэтому я не хочу проецировать одни и те же данные дважды по DRY причинам. Я нашел эту статью для 2.x
https://benjii.me/2018/01/expression-projection-magic-entity-framework-core/
Используя их метод компиляции, я тестировал это
Expression <Func<MyEntity, TempDto>> foo = e => new TempDto
{
dto = factory.Compile().Invoke(e),
children = e.Children.AsQueryable().Select(factory)
};
Обратите внимание на это не является действительно рекурсивным, но это первый шаг повторного использования проекции. Я выполнил первый тест без участия только ребенка, звонящего factory.Compile().Invoke
, и я получил
System.NullReferenceException: Object reference not set to an instance of an object..
at lambda_method(Closure , PaymentTransaction )
at lambda_method(Closure , QueryContext , DbDataReader , ResultContext , Int32[] , ResultCoordinator )
at Microsoft.EntityFrameworkCore.Query.Internal.QueryingEnumerable`1.AsyncEnumerator.MoveNextAsync()
at Microsoft.EntityFrameworkCore.EntityFrameworkQueryableExtensions.ToListAsync[TSource](IQueryable`1 source, CancellationToken cancellationToken)
at Microsoft.EntityFrameworkCore.EntityFrameworkQueryableExtensions.ToListAsync[TSource](IQueryable`1 source, CancellationToken cancellationToken)
at IC.Eko.Core.DataAccess.Repositories.PaymentRepository.ListUnmatchedPaymentsByAsync(Int32 accountId) in C:\git\Eko\src\IC.Eko.Core.DataAccess\Repositories\PaymentRespository.cs:line 113
at IC.Eko.Core.CommandHandlers.Payments.MapPaymentsWithInvoicesCommandHandler.Handle(MapPaymentsWithInvoicesCommand command) in C:\git\Eko\src\IC.Eko.Core\CommandHandlers\Payments\MapPaymentsWithInvoicesCommandHandler.cs:line 28
at IC.Eko.Core.Cqs.Commands.CommandRunner.ExecuteCommand(Func`1 commandFactory, IServiceProvider serviceProvider, Nullable`1 id) in C:\git\Eko\src\IC.Eko.Core.Cqs\Commands\CommandRunner.cs:line 256