我不想返回对象列表,但得到:
无法从
'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);
}
}
感谢所有帮助。
答案 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#。
接下来要记住的事情,希望这里不是问题。