Не удается преобразовать из 'System.Generic.Collection.List' - PullRequest
0 голосов
/ 18 октября 2019

Я не хочу возвращать Список объектов, но я получаю:

Невозможно преобразовать из 'System.Generic.Collection.List<ErrorDashboard_DatabaseEF.parsde_errors>' в 'ErrorDashboard_DatabaseEF.parsed_errors'

Мне удалось вернуть толькоодин объект при использовании FirstOrDefault (), но мне нужен каждый объект между указанными датами.

Контроллер

public ActionResult GetAllLogsWithMatchingHash(string hash)
    {
        using (var repository = new repositoryCollection())
        {
           var result =  repository.ErrorLogsRepository.GetAllLogsByHash("dc03cd92c3fa7f9a647adb9dbf95ab54");
        }
        return Redirect("home");
    }

Репозиторий

   public List<parsed_errorsModel> GetAllLogsByHash(string hashToSearchBy)
    {
        using (var context = new EdDbContext())
        {
            var dateFromToCheck = DateTime.Now.AddDays(-31);
            hashToSearchBy = "969da6814fa518a8fac3a03cc32378fc";
            var result =  context.parsed_errors.OrderByDescending(x=>x.TimeUtc).Where(c => c.TimeUtc > dateFromToCheck && c.HashDetails == hashToSearchBy).ToList();
            return parsed_errorTranslator.TranslateToModel(result); <-- here it where I get the error
        }
    }

Мой переводчик

 internal static parsed_errorsModel TranslateToModel (parsed_errors entity)
    {
        var result =  new parsed_errorsModel()
        {
            ErrorId = entity.ErrorId,
            Application = entity.Application,
            Host = entity.Host,
            Type = entity.Type,
            Source = entity.Source,
            Message = entity.Message,
            User = entity.User,
            StatusCode = entity.StatusCode,
            TimeUtc = entity.TimeUtc,
            Sequence = entity.Sequence,
            AllXml = entity.AllXml,
            Details = entity.Details,
            HashDetails = entity.HashDetails,
            PropertyPath = entity.PropertyPath,
            InternalErrorId = entity.InternalErrorId,
            RequestType = entity.RequestType,


        };
        return result;

    }

Этот запрос из того же репозитория работает

   public parsed_errorsModel GetErrorByTicketId(Guid ticketId)
    {
        using (var context = new EdDbContext())
        {
            var errorToGet = context.parsed_errors.FirstOrDefault(x => x.ErrorId.Equals(ticketId));
            return parsed_errorTranslator.TranslateToModel(errorToGet);
        }
    }

Я ценю всю помощь.

1 Ответ

3 голосов
/ 18 октября 2019

Эта строка кода имеет две проблемы:

return parsed_errorTranslator.TranslateToModel(result);

Во-первых, result представляет собой набор объектов. Но метод TranslateToModel ожидает один объект. Во-вторых, TranslateToModel возвращает отдельный объект, но в этом методе вы ожидаете вернуть коллекцию объектов.

Яблоко и корзина яблок - это две совершенно разные вещи.

Звучит так, как будто вы хотите вызвать TranslateToModel для каждого результата из данных и вернуть всю коллекцию. Вы должны быть в состоянии сделать это с помощью чего-то подобного:

return result.Select(r => parsed_errorTranslator.TranslateToModel(r)).ToList();

Это позволит выбрать все элементы в result (которые семантически должны, вероятно, называться results, чтобы избежать путаницы), вызывать этот метод для каждогоодин и вернуть полученный список.

Здесь нужно отметить одну вещь ... Поскольку вы уже вызываете .ToList() в запросе перед этой строкой кода, все ваши записи уже находятся в памяти, поэтому все, что вы делаете, находится в коде. Это может привести к проблемам с производительностью при больших объемах данных. Просто перебрасывать .ToList() с помощью LINQ - это скорее остановка, чем решение проблем.

Хотя это может работать в этом случае просто отлично, для больших объемов данных это означаетматериализация всех этих данных в память, где более динамичный подход к запросам данных поддержки может быть лучше. LINQ to Entities действительно хорош для упрощения такого подхода к динамическим запросам. Однако при переводе ваших деревьев выражений в код SQL (или какими-либо другими данными поддержки) он не сможет перевести TranslateToModel(), поскольку это пользовательский C #.

Просто что-то, о чем следует помнить в будущем. , надеюсь, не проблема здесь.

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