LINQ to Entities不支持指定的类型成员'Offset'

Ole*_*leh 1 c# linq

我在下一个代码运行时遇到异常:

 var fbPost = db.FacebookStatusUpdates
         .Where(f => 
               f.FacebookUpdateTime - f.ClientTime.Offset <= 
               DateTimeOffset.Now.UtcDateTime - ConvertTimeSpan(f.Offset) &&
               f.Status == FacebookNotificationStatus.Active &&
               f.Alarm.User.FbStatus == true).ToList();
Run Code Online (Sandbox Code Playgroud)

异常消息

LINQ to Entities不支持指定的类型成员'Offset'.仅支持初始值设定项,实体成员和实体导航属性.

我的模特:

 public class FacebookStatusUpdate
 {
    public long Id { get; set; }
    public DateTime FacebookUpdateTime { get; set; }
    public string PostId { get; set; }
    public DateTime? FacebookPostTime { get; set; }
    public DateTimeOffset ClientTime { get; set; }
    public int Offset { get; set; }

    public virtual FacebookNotificationStatus Status { get; set; }
    public virtual Alarm Alarm { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

有人能帮助我吗?

Jam*_*mes 6

当您使用LINQ to Entities时,您需要记住您的查询将被转换为TSQL - 如果Offset是自定义类型,那么EF不知道如何将其转换为SQL.

如果你可以将查询转换为LINQ to Objects ie,你当然可以使这个工作

 var fbPost = db.FacebookStatusUpdates
     .Where(f => f.Status == FacebookNotificationStatus.Active &&
                 f.Alarm.User.FbStatus == true)
     .AsEnumerable() // convert from L2E to L2O
     .Where(f => f.FacebookUpdateTime - f.ClientTime.Offset <= 
           DateTimeOffset.Now.UtcDateTime - ConvertTimeSpan(f.Offset))
     .ToList();
Run Code Online (Sandbox Code Playgroud)

在调用AsEnumerable()其余查询之后,LINQ to Objects了解Offset/ ConvertToTimespan编码.只是为了澄清,AsEnumerable()不会以正确的方式实现您的查询 - 您仍然会延迟加载.但是,任何进一步的查询AsEnumerable()都是在客户端完成的,没有更多的与DB的交互.

使用L2E时,最好坚持使用支持的基元类型.