Я использую 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 --- Конец внутренней трассировки стека исключений --- "
Может кто-нибудь помочь мне узнать, как исправить этот вопрос?