LINQ to Entities无法识别方法'System.DateTime ConvertTimeFromUtc(System.DateTime, System.TimeZoneInfo)'方法。

4

我有一个从数据库中获取的错误集合。时间以UTC格式存储,但我想将其转换为CST:

var errors = _errorsRepository.Errors.
    Select(e => new ErrorViewModel
    {
        ErrorId = e.ErrorId,
        Application = e.Application,
        Host = e.Host,
        Type = e.Type,
        Source = e.Source,
        Message = e.Message,
        User = e.User,
        StatusCode = e.StatusCode,
        TimeUtc = TimeZoneInfo.ConvertTimeFromUtc(
            e.TimeUtc, TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time")),
        Sequence = e.Sequence,
        AllXml = e.AllXml
     });

但是我遇到了这个错误:

LINQ to Entities不识别 ‘System.DateTime ConvertTimeFromUtc(System.DateTime, System.TimeZoneInfo)’ 方法,此方法无法转换为存储表达式

有人知道我可以采取什么措施来解决吗?

1个回答

6

LINQ to Entities会尝试将您的LINQ查询转换为SQL查询。由于您写的部分内容无法转换为SQL,因此出现了此错误。

您可以通过使用ToList()将查询首先转换为内存对象,然后使用LINQ to Objects来获取所需的结果以解决此问题:

var errors = _errorsRepository.Errors.ToList().
Select(e => new ErrorViewModel
{
    ErrorId = e.ErrorId,
    Application = e.Application,
    Host = e.Host,
    Type = e.Type,
    Source = e.Source,
    Message = e.Message,
    User = e.User,
    StatusCode = e.StatusCode,
    TimeUtc = TimeZoneInfo.ConvertTimeFromUtc(
        e.TimeUtc, TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time")),
    Sequence = e.Sequence,
    AllXml = e.AllXml
 });

请注意,这将首先将_errorsRepository中的所有错误全部存储到内存中。在这种情况下,您似乎并不关心这一点,因为您无论如何都需要获取它们所有。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接