Проект на дерево в EF Core 3.1 - PullRequest
0 голосов
/ 20 марта 2020

Эй, ребята, у нас есть сценарий в виде дерева (на самом деле мы используем только два уровня, но теоретически он может иметь несколько уровней листьев).

Объект довольно сложный, поэтому я не хочу проецировать одни и те же данные дважды по 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
...