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("FeatureGroups")
                //.Expand("功能组/应用程序")
                .ToDictionary(x => x, x => x.FeatureGroups
                    .Select(y => y.Application.ApplicationShortName)
                    。清楚的()
                    .ToList());

            var appsFound = viewModel.AppLookup
                .Where(x => x.Value.Count > 0)
                .ToList(); //这是 0 除非上面的 .Expand 行没有注释
4

1 回答 1

1

WCF DS 客户端的工作方式是将您在 LINQ 中编写的查询转换为 URL,对该 URL 执行请求,然后返回结果。问题是它不支持所有的 LINQ 表达式。ToDictionary 就是其中之一。所以在第二个示例中,似乎都是.Features。所以它发出一个请求“~/Features”。

~/Features 的行为是不返回相关实体,因此响应仅包含特征,而不包含相关特征组。结果,您会得到一个功能列表,其中每个功能都没有任何功能组。

有两种方法可以“解决”这个问题(你找到了这两种方法)。一种是将 .Expand("FeatureGroups") 添加到查询中,该查询告诉客户端将 $expand=FeatureGroups 附加到 URL,从而请求获取功能及其所有功能组。结果,查询返回一个特征列表,其中每个特征作为其所有正确的特征组也被填充。

解决此问题的另一种方法是在 LINQ 表达式中添加更多内容,以描述您希望也加载功能组的意图。您的第一个示例通过添加投影(选择)并从 FeatureGroups 中请求某些内容来实现这一点。客户端为了获得结果,还需要通过 $expand 询问功能组。

So the above behavior is by design. ToDictionary is not seen as part of the query (note that it's defined on IEnumerable not on IQueryable) and as such the client does what you asked for.

于 2012-05-04T13:02:55.757 回答