1

と の 2 つのテーブルを持つデータベースがあるとしGroupsますItems

  • 表にはとGroupsの 2 つの列しかありません。IdName
  • 表には、 、Itemsの 3 つの列があります。IdGroupIdName

ご覧のとおり、 と の間には 1 対多の関係がGroupsありItemsます。

WCF と LINQ を使用して Web サービスを構築しようとしています。新しい LINQ to SQL クラス ファイルを追加し、これら 2 つのテーブルをインポートしました。Visual Studio は適切なクラスを自動的に生成してくれます。

その後、すべてが機能しているかどうかを確認するためだけに、サービス用の単純なクライアントを作成しました。メソッドを呼び出した後、テーブルGetAllGroups()からすべてのグループを取得しGroupsます。ただし、それらのプロパティItemsは常に null です。

だから私の質問は - WCF にクラス全体 (クラス全体とそれに属するGroupすべてのもの)を返すように強制する方法はありますか? Itemsそれとも、これはそれが振る舞うべき方法ですか?

編集:これは、すべてを返す WCF サービス内の関数ですGroups

    public List<Group> GetAllGroups()
    {
        List<Group> groups = (from r in db.Groups select r).ToList();

        return groups;
    }

デバッグ中にチェックしたところ、関数Group内のすべてのオブジェクトにGetAllGroups()アイテムがありますが、クライアントがそれらを受け取った後、すべてのItemsプロパティがに設定されていnullます。

4

1 に答える 1

2

ほとんどの場合、Linq-to-SQL の既定の "遅延読み込み" 動作が発生しています。コレクションをデバッグして見ると.Items、アイテムがロードされます。ただし、サービス コードが正常に実行されている場合、これは発生しません。

ただし、これらのアイテムの「eager-loading」を強制することはできます - 次のようなことを試してください: (詳細については、DataLoadOptions を使用して遅延読み込みを制御するか、LINQ to SQL、遅延読み込みとプリフェッチを参照してください) 。

public List<Group> GetAllGroups()
{
    // this line should really be where you *instantiate* your "db" context!
    db.DeferredLoadingEnabled = false;

    DataLoadOptions dlo = new DataLoadOptions();
    dlo.LoadWith<Group>(g => g.Items);

    db.LoadOptions = dlo;

    List<Group> groups = (from r in db.Groups select r).ToList();

    return groups;
}

Itemsサービスを呼び出すと、コレクションにデータが取り込まれますか?

于 2012-08-11T15:31:03.270 に答える