您可以在Entity Framework中对ObjectSet使用Lambda表达式吗?

时间:2013-08-27 13:15:35

标签: entity-framework entity-framework-4 entity-framework-5

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

我哪里错了?

非常感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

ObjectSet类实现(除其他事项)IQueryableIEnumerable之外,这两个接口都有一个扩展方法Where,请参阅here和{ {3}}。 IQueryableIEnumerable(扩展方法各自的返回类型)都不能转换回ObjectSet

在运行时之前无法评估以下代码行:

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

但是如果删除了强制转换,代码将无法编译:

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

更新

对于查询,您可以将StdOrgUsers的返回类型从ObjectSet更改为IQueryable,但是会丢失所有其他方法,例如AddAttach等。您无法使用此技术应用标准过滤器。您可以使用名为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);