Не может использоваться для ошибки типа возврата при запросе через любой вызов API - PullRequest
0 голосов
/ 27 марта 2020

Я получаю сообщение об ошибке, которое мне не удается обойти при вызове API. Выдается ошибка:

    System.ArgumentException: Expression of type 'System.Threading.Tasks.Task`1[System.Linq.IQueryable`1[System.String]]' cannot be used for return type 'System.Threading.Tasks.Task`1[System.Collections.Generic.IEnumerable`1[System.String]]'
   at System.Linq.Expressions.Expression.ValidateLambdaArgs(Type delegateType, Expression& body, ReadOnlyCollection`1 parameters, String paramName)
   at System.Linq.Expressions.Expression.Lambda[TDelegate](Expression body, String name, Boolean tailCall, IEnumerable`1 parameters)
   at System.Linq.Expressions.Expression.Lambda[TDelegate](Expression body, Boolean tailCall, IEnumerable`1 parameters)
   at System.Linq.Expressions.Expression.Lambda[TDelegate](Expression body, ParameterExpression[] parameters)
   at Microsoft.EntityFrameworkCore.Query.QueryCompilationContext.CreateQueryExecutor[TResult](Expression query)
   at Microsoft.EntityFrameworkCore.Storage.Database.CompileQuery[TResult](Expression query, Boolean async)
   at Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.CompileQueryCore[TResult](IDatabase database, Expression query, IModel model, Boolean async)

Когда вызов API передается с использованием идентификатора организации, он должен захватывать все местоположения, связанные с этим идентификатором. Вот когда эта ошибка поднята. Я не могу на всю жизнь найти то, что вызывает это. Подробности вызова следующие:

Контроллер:

[HttpPost("{id}/getorganizationlocations")]
    public async Task<IActionResult> GetOrganizationLoc(int id)
    {
        var organizationNames = await _repo.GetOrganizationNameById(id);

        return Ok(organizationNames);
    }

Репозиторий:

    public async Task<IEnumerable<string>> GetOrganizationNameById(int LocationId)
{
    var OrganizationName = await _context.Locations
                .Include(l => l.Owners)
                .Where(o => o.Id == LocationId)
                .Select(l => l.Owners.Select(on => on.Owner.OrganizationName))
                .FirstOrDefaultAsync();

    return OrganizationName;
}

Интерфейс репозитория:

public interface IOrganizationRepository
{
    void Add<T>(T entity) where T: class;
    void Delete<T>(T entity) where T: class;
    Task<bool> SaveAll();
    Task<IEnumerable<Organizations>> GetOrganizations();
    Task<Organizations> GetOrganization(int id);
    Task<OrgToLoc> GetOwnees(int OrganizationId, int LocationId);

    // Begin Help on many to many 
    Task<IEnumerable<string>> GetOrganizationNameById(int LocationId);
    // End help many to many
}

Любой идеи о том, что может быть причиной этого?

При отладке запрос выполняется в контроллере, и, когда я выполняю его, возникает ошибка после того, как контроллер запрашивает данные из репозитория и возвращает данные в контроллер. Здесь зацикливается и выдает ошибку:

var organizationNames = await _repo.GetOrganizationNameById(id);

Есть идеи о том, что может быть причиной этого?

Ответы [ 2 ]

1 голос
/ 27 марта 2020

Сначала я хочу извиниться, потому что ты прав. Ваш запрос правильный!

Во-вторых, я создал приложение и обнаружил проблему:

Это известная ошибка в EF 3.0.0, здесь Проблема в GitHub

Мне удалось решить проблему, перейдя в раздел «Управление пакетами Nuget» и обновив 3 пакета до последней версии ER Core 3.1.3

enter image description here

После обновления этих 3 пакетов все заработало.

Ваш запрос не является проблемой.

0 голосов
/ 27 марта 2020

Как отметил Джонатан Альфаро, ответ состоял в том, чтобы изменить FirstOrDefaultAsyn c в репозитории на ToListAsyn c. Однако это вызвало еще одну ошибку преобразования:

Cannot implicitly convert type 'System.Collections.Generic.List<System.Collections.Generic.IEnumerable<string>>' to 'System.Collections.Generic.IEnumerable<string>'. An explicit conversion exists (are you missing a cast?)

Эта проблема была решена путем изменения. Выберите значение .SelectMany. Рабочая версия такова:

        public async Task<IEnumerable<string>> GetOrganizationNameById(int LocationId)
{
    var OrganizationName = await _context.Locations
                .Include(l => l.Owners)
                .Where(o => o.Id == LocationId)
                .SelectMany(l => l.Owners.Select(on => on.Owner.OrganizationName))
                .ToListAsync();

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