无法从“ System.Generic.Collection.List”转换

时间:2019-10-18 11:57:57

标签: c# .net model-view-controller

我不想返回对象列表,但得到:

  

无法从'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 个答案:

答案 0 :(得分:3)

此行代码有两个问题:

return parsed_errorTranslator.TranslateToModel(result);

首先,result是对象的集合。但是TranslateToModel方法只需要一个对象。其次,TranslateToModel 返回单个对象,但是在这种方法中,您期望返回对象的集合。

一个苹果和一篮子苹果是两个截然不同的东西。

听起来您想对数据中的每个结果调用TranslateToModel,并返回整个集合。您应该可以使用以下方法做到这一点:

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

这将选择result中的所有元素(为避免混淆,在语义上可能应称为results),在每个元素上调用该方法,然后返回结果列表。


这里要注意的一件事...由于您已经在此代码行之前在查询上调用.ToList(),因此所有记录都已在内存中,因此您所做的一切都在代码中。但是,这可能导致大量数据的性能问题。仅仅使用LINQ来解决.ToList()并不是解决问题的方法,而是一个权宜之计。

虽然 在这种情况下可以正常工作,但对于大量数据,这意味着将所有所有数据存储到内存中,这是一种更动态的查询支持方法数据可能会更好。 LINQ to Entities在促进这种动态查询方法方面非常出色。但是,将表达式树转换为SQL代码(或任何支持数据)时,将无法转换TranslateToModel(),因为这是自定义C#。

接下来要记住的事情,希望这里不是问题。