Mon IQueryable ressemble à ceci:
IQueryable<TEntity> query = context.Set<TEntity>();
query = query.Include("Car").ThenInclude("Model");
'IQueryable' ne contient pas de définition pour 'ThenInclude' et aucune méthode d'extension 'ThenInclude' acceptant un premier argument de type 'IQueryable' n'a pu être trouvée (une directive using ou une référence d'assembly vous manque
J'ai toutes les références nécessaires:
using Content.Data.Models;
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Threading.Tasks;
Pourquoi ne reconnaît-il pas ThenInclude?
Question:
[Content.Data.Models.Article]).Where(x => (((x.BaseContentItem.SiteId == value(Content.Business.Managers.ArticleManager+<>c__DisplayClass8_0).id) AndAlso x.BaseContentItem.IsActive) AndAlso x.BaseContentItem.IsLive)).Include("BaseContentItem").Include("BaseContentItem.TopicTag").Include("MainImage")}
Echoue après l’inclusion de la partie .Include("BaseContentItem.TopicTag")
.
Donc, je viens de lire qu'avec le référentiel générique, vous perdez ThenInclude. J'utilise thise rep générique:
public class ReadOnlyRepository<TContext> : IReadOnlyRepository
where TContext : DbContext
{
protected readonly TContext context;
public ReadOnlyRepository(TContext context)
{
this.context = context;
}
private IQueryable<TEntity> GetQueryable<TEntity>(
Expression<Func<TEntity, bool>> filter = null,
Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderBy = null,
string includeProperties = null,
int? skip = null,
int? take = null)
where TEntity : class, IEntity
{
includeProperties = includeProperties ?? string.Empty;
IQueryable<TEntity> query = context.Set<TEntity>();
if (filter != null)
{
query = query.Where(filter);
}
foreach (var includeProperty in includeProperties.Split
(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries))
{
query = query.Include(includeProperty);
}
if (orderBy != null)
{
query = orderBy(query);
}
if (skip.HasValue)
{
query = query.Skip(skip.Value);
}
if (take.HasValue)
{
query = query.Take(take.Value);
}
return query;
}
ThenInclude
est disponible uniquement lorsque vous utilisez le paramètre Include
surcharge avec l'expression lambda:
query = query.Include(e => e.Car).ThenInclude(e => e.Model);
Lorsque vous utilisez l'argument Include
surcharge avec chaîne, il n'est pas nécessaire d' ThenInclude
puisque vous pouvez spécifier le chemin d'accès complet à la propriété dans la chaîne passée:
query = query.Include("Car.Model");