Источник запроса уже связан с выражением - PullRequest
0 голосов
/ 05 июня 2018

У меня многоязычный объект (переведенные строки хранятся в отдельной таблице), и я хотел бы отфильтровать переведенную строку в текущей культуре пользовательского интерфейса.Если для текущей культуры пользовательского интерфейса нет переведенной строки, я хотел бы взять и отфильтровать первую переведенную по умолчанию строку сущности.

Я использую .NET Core 2.1, EF Core 2.1 иФреймворк ABP Boilerplate 3.6.2.

Вот мой код.Эта функция фильтрует сущность DocumentCategory по свойству Name связанной сущности DocumentCategoryTranslation .Я беру текущую переведенную строку интерфейса, если таковая имеется, иначе я беру первую.Возвращенный объект - просто обертка вокруг моего результата.

public async Task<PagedResultDto<GetDocumentCategoryForView>> GetAll(GetAllDocumentCategoriesInput input)
{
    var query = (from dc in _documentCategoryRepository.GetAllIncluding(dc => dc.Translations)
                select new
                {
                    dc,
                    t = dc.Translations.FirstOrDefault(t => t.Language == CultureInfo.CurrentUICulture.Name) ?? dc.Translations.First()
                }).AsQueryable()
                .WhereIf(!string.IsNullOrWhiteSpace(input.Filter), e => false || e.t.Name.ToLower().Contains(input.Filter.ToLower()));

    var result = await query.ToListAsync();

    return new PagedResultDto<GetDocumentCategoryForView>(
        result.Count,
        result.Select(o => new GetDocumentCategoryForView()
        {
          DocumentCategory = ObjectMapper.Map<DocumentCategoryDto>(o.dc)
        }).ToList()
    );
}

Исключение, которое я получаю:

System.InvalidOperationException: 'Источник запроса (из DocumentCategoryTranslation t в значении (Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable`1 [Colnec.Documents.DocumentCategoryTranslation])) уже связан с выражением. '

Если я удаляю GetAllInc включая (dc => dc.Translations) запрос работает, но сопоставление, выполненное в конце функции, выдает нулевое исключение (поскольку оно использует свойство Translations объекта dc).

Функция расширения Autopper (из ABPфреймворк).Он устанавливает свойство Name целевого объекта в текущую переведенную строку языка интерфейса пользователя.Здесь нужно загрузить свойство Переводы .

public static void CreateMultiLingualMapFromEntity<TMultiLingualEntity, TMultiLingualEntityPrimaryKey, TTranslation, TDestination>(
    this IMapperConfigurationExpression configuration, MultiLingualMapContext multiLingualMapContext)
    where TTranslation : class, IEntityTranslation<TMultiLingualEntity, TMultiLingualEntityPrimaryKey>
    where TMultiLingualEntity : IMultiLingualEntity<TTranslation>
{
    configuration.CreateMap<TTranslation, TDestination>();

    configuration.CreateMap<TMultiLingualEntity, TDestination>().BeforeMap((source, destination, context) =>
    {
        var translation = source.Translations.FirstOrDefault(pt => pt.Language == CultureInfo.CurrentUICulture.Name);
        if (translation != null)
        {
            context.Mapper.Map(translation, destination);
            return;
        }

        var defaultLanguage = multiLingualMapContext.SettingManager
                                                    .GetSettingValue(LocalizationSettingNames.DefaultLanguage);

        translation = source.Translations.FirstOrDefault(pt => pt.Language == defaultLanguage);
        if (translation != null)
        {
            context.Mapper.Map(translation, destination);
            return;
        }

        translation = source.Translations.FirstOrDefault();
        if (translation != null)
        {
            context.Mapper.Map(translation, destination);
        }
    });
}

Я пробовал много разных вещей, но я не знаю, как правильно обработать этот случай.Если у некоторых из вас есть хорошее решение для этого, я был бы очень признателен за вашу помощь.

Хорошего дня!Александр

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...