然后在EF Core查询中无法识别

ame*_*els 6 c# linq entity-framework entity-framework-core

我的IQueryable看起来像这样:

 IQueryable<TEntity> query = context.Set<TEntity>();
query = query.Include("Car").ThenInclude("Model");
Run Code Online (Sandbox Code Playgroud)

'IQueryable'不包含'ThenInclude'的定义,也没有扩展方法'ThenInclude'可以找到'IQueryable'类型的第一个参数(你是否缺少using指令或汇编引用?)

我需要所有参考资料:

using Content.Data.Models;    
using Microsoft.EntityFrameworkCore;    
using System;    
using System.Collections.Generic;    
using System.Linq;    
using System.Linq.Expressions;    
using System.Threading.Tasks;   
Run Code Online (Sandbox Code Playgroud)

为什么它不识别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")}
Run Code Online (Sandbox Code Playgroud)

包含.Include("BaseContentItem.TopicTag")零件后失败.

所以我只是通过通用存储库读到你失去了ThenInclude.我正在使用这个通用代表:

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;
        }
Run Code Online (Sandbox Code Playgroud)

Iva*_*oev 16

ThenInclude仅当您使用Include带有lambda表达式参数的重载时才可用:

query = query.Include(e => e.Car).ThenInclude(e => e.Model);
Run Code Online (Sandbox Code Playgroud)

当您使用Include带有字符串参数的重载时,不需要,ThenInclude因为您可以在传递的字符串中指定整个属性路径:

query = query.Include("Car.Model");
Run Code Online (Sandbox Code Playgroud)


Dav*_*ris 6

您的问题可能是缺少对 Microsoft.EntityFrameworkCore.Relational 的引用?

这可以通过包管理器添加。

还要确保您使用的是来自 Microsoft.EntityFrameworkCore 命名空间的 .include 而不是另一个 .Include (它没有 .ThenInclude)