Entity Framework условно включает дочерние элементы уже включенного свойстваC#

Место общения программистов C#
Ответить
Anonymous
 Entity Framework условно включает дочерние элементы уже включенного свойства

Сообщение Anonymous »

У меня есть модель Song, в которой есть поле Song.SongArtistRelations, которое представляет собой список объектов SongArtistRelation. Оно представляет собой отношение «многие ко многим».
Я реализовал поиск песен. Однако мне нужна отложенная загрузка и загрузка полных данных об исполнителях только в случае необходимости в запросе.
Я использую Microsoft.EntityFrameworkCore.
Полный код доступен по адресу: https://github.com/danisuba10/Musify-o/ ... chSongs.cs
В начале я включаю SongArtistRelations:

Код: Выделить всё

var query = _context.Songs
.Include(s => s.SongArtistRelations)
.AsQueryable();
Затем я проверяю, нужно ли мне включать исполнителей или нужны только их идентификаторы. Я нашел следующее решение, но получаю сообщение об ошибке:

Код: Выделить всё

if (request.IncludeArtists)
{
query = query.Include(s => s.SongArtistRelations.Select(ar => ar.Artist));
}
Ошибка:

Код: Выделить всё

System.InvalidOperationException: The expression 's.SongArtistRelations.AsQueryable().Select(ar => ar.Artist)' is invalid inside an 'Include' operation, since it does not represent a property access: 't => t.MyProperty'. To target navigations declared on derived types, use casting ('t => ((Derived)t).MyProperty') or the 'as' operator ('t => (t as Derived).MyProperty'). Collection navigation access can be filtered by composing Where, OrderBy(Descending), ThenBy(Descending), Skip or Take operations. For more information on including related data, see https://go.microsoft.com/fwlink/?LinkID=746393.
at Microsoft.EntityFrameworkCore.Query.Internal.NavigationExpandingExpressionVisitor.
g__ExtractIncludeFilter|36_0(Expression currentExpression, Expression includeExpression)

at Microsoft.EntityFrameworkCore.Query.Internal.NavigationExpandingExpressionVisitor.ProcessInclude(NavigationExpansionExpression source, Expression expression, Boolean thenInclude, Boolean setLoaded)

at Microsoft.EntityFrameworkCore.Query.Internal.NavigationExpandingExpressionVisitor.VisitMethodCall(MethodCallExpression methodCallExpression)

at Microsoft.EntityFrameworkCore.Query.Internal.NavigationExpandingExpressionVisitor.Expand(Expression query)

at Microsoft.EntityFrameworkCore.Query.QueryTranslationPreprocessor.Process(Expression query)

at Microsoft.EntityFrameworkCore.Query.QueryCompilationContext.CreateQueryExecutor[TResult](Expression query)

at Microsoft.EntityFrameworkCore.Storage.Database.CompileQuery[TResult](Expression query, Boolean async)

at Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.CompileQueryCore[TResult](IDatabase database, Expression query, IModel model, Boolean async)

at Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.c__DisplayClass12_0`1.b__0()

at Microsoft.EntityFrameworkCore.Query.Internal.CompiledQueryCache.GetOrAddQuery[TResult](Object cacheKey, Func`1 compiler)

at Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.ExecuteAsync[TResult](Expression query, CancellationToken cancellationToken)

at Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryProvider.ExecuteAsync[TResult](Expression expression, CancellationToken cancellationToken)

at Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable`1.GetAsyncEnumerator(CancellationToken cancellationToken)

at Microsoft.EntityFrameworkCore.EntityFrameworkQueryableExtensions.IncludableQueryable`2.GetAsyncEnumerator(CancellationToken cancellationToken)

at System.Runtime.CompilerServices.ConfiguredCancelableAsyncEnumerable`1.GetAsyncEnumerator()

at Microsoft.EntityFrameworkCore.EntityFrameworkQueryableExtensions.ToListAsync[TSource](IQueryable`1 source, CancellationToken cancellationToken)

at Application.Songs.SearchSongs.Handler.Handle(Query request, CancellationToken cancellationToken) in C:\Project Folder\CSHARP\Musify-o\Application\Songs\SearchSongs.cs:line 68
Как я могу позже условно включать дочерние элементы, не выполняя Include.ThenInclude, поскольку в этом случае SongArtistRelations будет запрошен дважды, что приведет к проблемам с производительностью.
>

Подробнее здесь: https://stackoverflow.com/questions/790 ... d-property
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»