我在下一个代码运行时遇到异常:
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)
有人能帮助我吗?
当您使用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时,最好坚持使用支持的基元类型.
| 归档时间: |
|
| 查看次数: |
1520 次 |
| 最近记录: |