我正在使用EF5,虽然我确信这是一个更普遍的EF问题。
我无法让以下工作。我一直在犯错:
Unable to cast object of type 'System.Data.Objects.ObjectQuery`1[StdOrgUser]' to type 'System.Data.Objects.ObjectSet`1[StdOrgUser]'.
代码:
public ObjectSet<StdOrgUser> StdOrgUser
{
get
{
if ((_StdOrgUser == null))
{
_StdOrgUser = base.CreateObjectSet<StdOrgUser>("StdOrgUser");
_StdOrgUser = (ObjectSet<StdOrgUser>) _StdOrgUser.Where(r => r.IsActive == false);
}
return _StdOrgUser;
}
}
编译好。 Intellisense使我能够选择LINQ运算符等。当我运行它时,我得到上述运行时错误。
我哪里错了?
非常感谢您的帮助。
答案 0 :(得分:1)
ObjectSet
类实现(除其他事项)IQueryable
和IEnumerable
之外,这两个接口都有一个扩展方法Where
,请参阅here和{ {3}}。 IQueryable
和IEnumerable
(扩展方法各自的返回类型)都不能转换回ObjectSet
。
在运行时之前无法评估以下代码行:
_StdOrgUser = (ObjectSet<StdOrgUser>) _StdOrgUser.Where(r => r.IsActive == false);
但是如果删除了强制转换,代码将无法编译:
_StdOrgUser = _StdOrgUser.Where(r => r.IsActive == false);
更新
对于查询,您可以将StdOrgUsers
的返回类型从ObjectSet
更改为IQueryable
,但是会丢失所有其他方法,例如Add
,Attach
等。您无法使用此技术应用标准过滤器。您可以使用名为ActiveUsers()
public static IQueryable<StdOrgUser> ActiveUsers(this ObjectSet<StdOrgUser> users)
{
return users.Where(r => r.IsActive == false);
}
你需要做的是记住在每个查询中使用它(不是很漂亮,但它确实显示了意图)
var results = myContext
.StdOrgUser
.ActiveUsers()
.Where(//some filter);