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クラスは (とりわけ) IQueryableand を実装します。IEnumerableこれらのインターフェースには両方とも拡張メソッドがあります。こちらこちらWhereを参照してください。どちらも(拡張メソッドのそれぞれの戻り値の型です) を にキャストすることはできません。IQueryableIEnumerableObjectSet

次のコード行は、実行時まで評価できません。

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

ただし、キャストを削除すると、コードはコンパイルされません。

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

アップデート

クエリの場合、 の戻り値の型をStdOrgUsersからObjectSetに変更できますが、など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 に答える