ThenInclude not recognized in EF Core query

c# entity-framework entity-framework-core linq


My IQueryable looks like this:

 IQueryable<TEntity> query = context.Set<TEntity>();
query = query.Include("Car").ThenInclude("Model");

'IQueryable' does not contain a definition for 'ThenInclude' and no extension method 'ThenInclude' accepting a first argument of type 'IQueryable' could be found (are you missing a using directive or an assembly reference?)

I have all references needed:

using Content.Data.Models;    
using Microsoft.EntityFrameworkCore;    
using System;    
using System.Collections.Generic;    
using System.Linq;    
using System.Linq.Expressions;    
using System.Threading.Tasks;   

Why it doesn't recognize ThenInclude?


[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")}

Fails after I include .Include("BaseContentItem.TopicTag") part.

So I just read that with generic repository you lose ThenInclude. I am using thise generic rep:

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;
2/7/2018 5:01:11 PM

Popular Answer

ThenInclude is available only when you use the Include overload with lambda expression parameter:

query = query.Include(e => e.Car).ThenInclude(e => e.Model);

When you use the Include overload with string argument, there is no need of ThenInclude since you can specify the whole property path in the passed string:

query = query.Include("Car.Model");
9/1/2017 12:59:09 PM

Related Questions


Licensed under: CC-BY-SA with attribution
Not affiliated with Stack Overflow
Licensed under: CC-BY-SA with attribution
Not affiliated with Stack Overflow