1

我试图使用 LINQ 对将用于报告的数据进行排序。报告结构如下所示:


开发者名称

日期 | 小时 | 项目名称 | 周结束
日期 | 小时 | 项目名称 | 周结束
日期 | 小时 | 项目名称 | 周末结束

开发者名称

日期 | 小时 | 项目名称 | 周结束
日期 | 小时 | 项目名称 | 周末结束

开发者名称

日期 | 小时 | 项目名称 | 周结束
日期 | 小时 | 项目名称 | 周结束
日期 | 小时 | 项目名称 | 周末结束


我从 .dbml 文件中获取所有数据。对于这样的排序,我有这个 linq 查询:

DataClasses1DataContext context = new DataClasses1DataContext();
        System.Data.Linq.ISingleResult<s_SummaryReportResult> res = context.s_timesheet_SummaryReport(startDate, endDate);

        var orb = from c in res
                  group c by c.developer
                  into devgroup
                  select new 
                  {   
                      Dev = devgroup.Key,
                      devData = from o in res
                                      select new {
                                        o.Date,
                                        o.Hours,
                                        o.projectname,
                                        o.week_ending
                                      }};

IDictionary dic_orb = orb.ToDictionary(result => result.Dev.ToString(), result => result.devData);


        foreach (KeyValuePair<string, object> item in dic_orb)
        {
          object brr =  item.Value;
        }

可悲的是,在 foreach 步骤中,我得到一个“InvalidCastException”。

关于我如何解决该 foreach 的任何线索,或者在某种意义上,如何更好地对 LINQ 查询进行分组?

提前致谢。

4

2 回答 2

1

dic_orb是查询Dictionary<string, IEnumerable<'a>>'a定义的匿名类型。该类型KeyValuePair<string, IEnumerable<'a>>不可转换为KeyValuePair<string, object>因此无效的强制转换。解决方法是在循环中声明itemusing var :foreach

foreach (var item in dic_orb)
{
    object brr =  item.Value;
}

因为item.Value是一个,IEnumerable<'a>你可以使用它来迭代它

var brr = item.Value;
foreach(var b in brr)
{
}

如果您只想迭代所有嵌套集合,您可以使用

foreach(var b in dic_orb.SelectMany(kvp => kvp.Vaue))
{
}
于 2012-05-23T22:06:44.037 回答
0

你确定 result.devData 是 typeobject吗?

只是改变

foreach (KeyValuePair<string, object> item in dic_orb)

foreach (var item in dic_orb)

你应该自动获得正确的类型。否则检查什么类型devData并相应地更改您的 KeyValuePair。

于 2012-05-23T22:02:31.793 回答