Выражение LINQ 'DbSet <Contacts>\ n .Where (c => __res_RelatedContacts_0 \ n.Any (r => r.IdVal.Equals (c .ContactId)))' не может быть переведено - PullRequest
0 голосов
/ 27 февраля 2020

Я использую asp. net core 3.1 и EFCore 3.1.1.

Код:

public class SampleDbContext : DbContext
{
    public DbSet<Articles> Articles
    {
        get;
        set;
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        var converter = new NumberToStringConverter<int>();
        // For Articles
        modelBuilder.Entity<Articles>().OwnsMany(p => p.RelatedCountries, a =>
        {
            a.WithOwner().HasForeignKey("Articlesid");
            a.Property<int>("id");
            a.Property(o => o.IdVal);
        }

        );
    }
}

public class Articles
{
    public int ArticleId
    {
        get;
        set;
    }

    public ICollection<RelatedEntityId> RelatedContacts
    {
        get;
        set;
    }
}

public class RelatedEntityId
{
    public int IdVal
    {
        get;
        set;
    }
}

Мой класс обслуживания:

public class ArticleService : IArticleService
{
    private readonly SampleDbContext _dbContext;
    private readonly ICacheService<Images, ImageDTO> _imageCacheService;
    private readonly ICacheService<Countries, CountryDTO> _countryCacheService;
    private readonly ICommonService _commonService;
    private readonly IMapper _mapper;
    public ArticleService(SampleDbContext dbContext, ICacheService<Images, ImageDTO> imageCacheService, ICacheService<Countries, CountryDTO> countryCacheService, ICommonService commonService, IMapper mapper)
    {
        _dbContext = dbContext ?? throw new ArgumentNullException(nameof(dbContext));
        _imageCacheService = imageCacheService ?? throw new ArgumentNullException(nameof(imageCacheService));
        _countryCacheService = countryCacheService ?? throw new ArgumentNullException(nameof(countryCacheService));
        _commonService = commonService ?? throw new ArgumentNullException(nameof(commonService));
        _mapper = mapper ?? throw new ArgumentNullException(nameof(mapper));
    }

    public async Task<ArticleDTO> GetArticleDetailsAsync(int articleId, int defaultLanguageId, List<int> localeLanguageIdList)
    {
        // Get articles
        var articles = await _dbContext.Articles.Where(a => a.ArticleId.Equals(articleId) && a.IsPublished.Equals(true)).OrderByDescending(a => a.ArticleId).Select(a => new
        {
        a.ArticleId, a.PublishedDate, a.Author, a.ImageId, a.State, a.Type, a.SubType, a.ResourcePosition, a.DisclaimerId, a.CreatedDate, a.UpdatedDate, a.NotificationSentDate, a.Title, a.TeaserText, a.Content, a.RelatedContacts, a.LanguageId
        }

        ).AsNoTracking().ToListAsync();
        var res = articles.Where(a => a.LanguageId.Equals(defaultLanguageId) && Convert.ToDateTime(a.PublishedDate) <= DateTime.UtcNow).FirstOrDefault();
        var contacts = new List<ContactDTO>();
        if (res.RelatedContacts.Count > 0)
        {
            contacts = await _dbContext.Contacts.Where(co => res.RelatedContacts.Any(r => r.IdVal.Equals(co.ContactId))).ToListAsync();
        }
    }
}

Сообщение об ошибке:

«message»: «GraphQL.ExecutionError: выражение LINQ 'DbSet \ n .Where (c => __res_RelatedContacts_0 \ n .Any (r => r.IdVal. Equals (c .ContactId))) 'не может быть переведен. Либо переписать запрос в форме, которую можно перевести, либо явно переключиться на оценку клиента, вставив вызов либо AsEnumerable (), AsAsyncEnumerable (), ToList ( ) или ToListAsyn c (). Для получения дополнительной информации см. https://go.microsoft.com/fwlink/?linkid=2101038. \ n ---> System.InvalidOperationException: выражение LINQ 'DbSet \ n .Where (c => __res_RelatedContacts_0 \ n .Any (r => r.IdVal.Equals (c .ContactId))) 'не удалось перевести. Либо переписать запрос в форме, которую можно перевести, либо переключиться на оценку клиента явно, вставив вызов в AsEnumerable (), AsAsyncEnumerable (), ToList () или ToListAsyn c (). См. https://go.microsoft.com/fwlink/?linkid=2101038 для получения дополнительной информации \ п на Microsoft.EntityFrameworkCore.Query.QueryableMethodTranslatingExpressionVisitor.g__CheckTranslated |. 8_0 (ShapedQueryExpression переводится, <> c__DisplayClass8_0 и) \ п на Microsoft.EntityFrameworkCore.Query.QueryableMethodTranslatingExpressionVisitor.VisitMethodCall (MethodCallExpression methodCallExpression) \ п на System.Linq.Expressions .MethodCallExpression.Accept (посетитель ExpressionVisitor) \ n в System.Linq.Expressions.ExpressionVisitor.Visit (узел выражения) \ n в Microsoft.EntityFrameworkCore.Query.QueryCompilationContext.CreateQueryExecutor. Storage.Database.CompileQuery [TResult] (запрос выражения, логический асин c) \ n в Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.CompileQueryCore [TResult] (база данных ID, запрос выражения, модель IModel, логическая асин c ) \ n в Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler. <> c__DisplayClass12_0 1.<ExecuteAsync>b__0()\n at Microsoft.EntityFrameworkCore.Query.Internal.CompiledQueryCache.GetOrAddQueryCore[TFunc](Object cacheKey, Func 1 компилятор) \ n в Microsoft.EntityFra meworkCore.Query.Internal.CompiledQueryCache.GetOrAddQuery [TResult] (Object cacheKey, Fun c1 compiler)\n at Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.ExecuteAsync[TResult](Expression query, CancellationToken cancellationToken)\n at Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryProvider.ExecuteAsync[TResult](Expression expression, CancellationToken cancellationToken)\n at Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable 1. n в Author.Query.Persistence.ArticleService.GetArticleDetailsAsyn c (Int32 articleId, Int32 defaultLanguageId, список 1 localeLanguageIdList) in /src/QueryStack/Author.Query.Persistence/ArticleService.cs:line 88\n at Author.Query.Persistence.ArticleService.GetArticleAsync(Int32 articleId, String countryName) in /src/QueryStack/Author.Query.Persistence/ArticleService.cs:line 47\n at GraphQL.DataLoader.DataLoaderBase 1.DispatchAsyn c (CancellationToken cancellationToken) \ n в Author.Query.New.API.GversQL.Res. ArticlesResolver. <> c__DisplayClass3_1. d.MoveNext () в /src/QueryStack/Author.Query.New.API/GraphQL/Resolvers/ArticlesResolver.cs:line 41 \ n --- Конец трассировки стека из предыдущего расположения, где было сгенерировано исключение --- \ n at GraphQL.Types.ResolveFieldContext * разрешение 1022 * 2, ошибка Func`2) \ n --- Конец внутренней трассировки стека исключений --- "

Может кто-нибудь помочь мне узнать, как исправить этот вопрос?

...