0

次の関係を持つ 3 つのオブジェクトがあります。Feature には、FeatureGroup オブジェクトの List<> が含まれています。FeatureGroup には、Application オブジェクトがプロパティとして含まれています。

特定の機能についてアプリケーション名のリストを取得できる辞書を作成したいと考えています (アプリケーションは機能を共有しており、どのアプリがどの機能をサポートしているかを確認したい)。

正しく動作するコードの一部を次に示します。

            Dictionary(Feature, List(string)) AppLookup = this.DataContext().Features
                .Select(x => 新規
                {
                    機能 = x、
                    AppNames = x.FeatureGroups
                        .Select(y => y.Application.ApplicationShortName)
                        。明確()
                        .ToList()
                }))
                .ToDictionary(x => x.Feature, x => x.AppNames);

            var appsFound = viewModel.AppLookup
                .Where(x => x.Value.Count > 0)
                .ToList(); //これには正しい値である 27 が含まれます

これは私がコーディングしたかった元の方法ですが、2つの Expand() 行のコメントを外さない限り機能しないようです:

            Dictionary(Feature, List(string)) AppLookup = this.DataContext().Features
                //.Expand("機能グループ")
                //.Expand("機能グループ/アプリケーション")
                .ToDictionary(x => x, x => x.FeatureGroups
                    .Select(y => y.Application.ApplicationShortName)
                    。明確()
                    .ToList());

            var appsFound = viewModel.AppLookup
                .Where(x => x.Value.Count > 0)
                .ToList(); // 上記の .Expand 行がコメント解除されていない限り、これは 0 です
4

1 に答える 1

1

WCF DS クライアントが機能する方法は、LINQ で記述したクエリを取得して URL に変換し、その URL で要求を実行して、結果を取得することです。問題は、すべての LINQ 式がサポートされていないことです。ToDictionary はその 1 つです。したがって、2 番目のサンプルでは、​​.Features だけが表示されます。したがって、リクエスト「~/Features」を発行します。

~/Features の動作は関連するエンティティを返さないため、応答には機能のみが含まれ、関連する機能グループは含まれません。その結果、各機能に機能グループがない機能のリストが返されます。

これを「修正」する方法は 2 つあります (両方とも見つかりました)。1 つは、クエリに .Expand("FeatureGroups") を追加して、クライアントに $expand=FeatureGroups を URL に追加し、機能とそのすべての機能グループを取得するように要求するように指示することです。その結果、クエリはフィーチャのリストを返します。各フィーチャは、そのすべての適切なフィーチャ グループとして埋められます。

これを修正するもう 1 つの方法は、LINQ 式にさらに追加して、機能グループも読み込むという意図を記述することです。最初のサンプルでは、​​プロジェクション (選択) を追加し、FeatureGroups から何かを要求することでそれを行います。結果を取得するために、クライアントは $expand を介して機能グループも要求する必要があります。

したがって、上記の動作は仕様によるものです。ToDictionary はクエリの一部として認識されず (IQueryable ではなく IEnumerable で定義されていることに注意してください)、クライアントは要求したことを実行します。

于 2012-05-04T13:02:55.757 に答える