0

我正在使用 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 运算符等。当我运行它时,我得到了上述运行时错误。

我哪里错了?

非常感谢您的帮助。

4

1 回答 1

1

该类ObjectSet实现(除其他外)IQueryable并且IEnumerable,这两个接口都有一个扩展方法Where,请参见此处此处。也不IQueryableIEnumerable(它们是扩展方法的各自返回类型)不能被强制转换回ObjectSet.

直到运行时才能评估以下代码行:

_StdOrgUser = (ObjectSet<StdOrgUser>) _StdOrgUser.Where(r => r.IsActive == false);

但如果你删除演员,代码将无法编译:

_StdOrgUser = _StdOrgUser.Where(r => r.IsActive == false);

更新

对于查询,您可以更改StdOrgUsersfrom ObjectSetto的返回类型,但您会丢失所有其他方法,IQueryable例如等。您不能使用此技术应用标准过滤器。你可以有一个名为的扩展方法AddAttachActiveUsers()

public static IQueryable<StdOrgUser> ActiveUsers(this ObjectSet<StdOrgUser> users)
{
    return users.Where(r => r.IsActive == false);
}

您需要做的是记住在每个查询中使用它(不是很漂亮,但它确实清楚地表明了意图)

var results = myContext
    .StdOrgUser
    .ActiveUsers()
    .Where(//some filter);
于 2013-08-27T13:36:49.443 回答