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

时间:2013-03-31 21:57:53

标签: c# linq datetime exception-handling linq-to-entities

我收集了一些我从数据库中提取的错误。时间存储为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 个答案:

答案 0 :(得分:5)

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中获取所有错误。在这种情况下,看起来这对你来说无关紧要,因为无论如何你都会得到所有这些。