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

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

Сообщение 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: выражение 's.SongArtistRelations.AsQueryable().Select(ar = > ar.Artist)» недействителен внутри операции «Include», поскольку он не представляет доступ к свойству: «t => t.MyProperty». Чтобы настроить навигацию, объявленную в производных типах, используйте приведение ('t => ((Derived)t).MyProperty') или оператор 'as' ('t => (t as Derived).MyProperty'). Доступ к навигации по коллекции можно отфильтровать, составив операции Where, OrderBy(Descending), thenBy(Descending), Skip или Take. Дополнительные сведения о включении связанных данных см. на странице https://go.microsoft.com/fwlink/?LinkID=746393.
на Microsoft.EntityFrameworkCore.Query.Internal.NavigationExpandingExpressionVisitor.g__ExtractIncludeFilter| 36_0(выражение currentExpression, выражение includeExpression)

at Microsoft.EntityFrameworkCore.Query.Internal.NavigationExpandingExpressionVisitor.ProcessInclude(источник NavigationExpansionExpression, выражение выражения, логическое значение thenInclude, логическое значение setLoaded)

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

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

в Microsoft. EntityFrameworkCore.Query.QueryTranslationPreprocessor.Process(запрос по выражению)

в Microsoft.EntityFrameworkCore.Query.QueryCompilationContext.CreateQueryExecutor[TResult](запрос по выражению)

в Microsoft.EntityFrameworkCore.Storage .Database.CompileQuery[TResult](запрос-выражение, логический асинхронный запрос)

в Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.CompileQueryCore[TResult](база данных IDatabase, запрос-выражение, модель IModel, логический асинхронный)

в Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.c__DisplayClass12_0

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

1.b__0()   at Microsoft.EntityFrameworkCore.Query.Internal.CompiledQueryCache.GetOrAddQuery[TResult](Object cacheKey, Func
1 компилятор)

в Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.ExecuteAsync[TResult](запрос-выражение, CancellationToken cancelToken)

в Microsoft.EntityFrameworkCore. Query.Internal.EntityQueryProvider.ExecuteAsync[TResult](выражение выражения, CancellationToken cancelToken)

в Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable

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

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

в System.Runtime.CompilerServices.ConfiguredCancelableAsyncEnumerable

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

1.GetAsyncEnumerator()   at Microsoft.EntityFrameworkCore.EntityFrameworkQueryableExtensions.ToListAsync[TSource](IQueryable
1 источник, CancellationToken cancelToken)

в Application.Songs.SearchSongs.Handler.Handle (запрос запроса, CancellationToken cancelToken) в C:\Project Folder\CSHARP\Musify-o\Application\ Songs\SearchSongs.cs:line 68

Как я могу позже условно включать дочерние элементы, не выполняя Include.ThenInclude таким образом SongArtistRelations будет запрошен дважды, что приведет к проблемам с производительностью.

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

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

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

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

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

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