延迟执行 - 字典输出

时间:2015-07-26 13:52:55

标签: c# linq entity-framework linq-to-sql linq-to-entities

我有一个Linq查询,返回大约五十万行。但是,由于我没有调用ToList(),执行仍然是延迟的。到目前为止一切都很好。

我需要来自此查询的Dictionary<int, List<DateTime>>输出,该输出将在字典中返回大约100,000个条目(不同的整数列值)。

我尝试过这样的事情......

var myDictionary = new Dictionary<int, List<DateTime>>();

var myDictionaryOutput = MyQuery.Select(p => AddOrUpdateDictionary(myDictionary, p));

MyQuery是我的linq查询,AddOrUpdateDictionary是我写的自定义函数。

这会将每个条目投射到一个不是我想要的字典。

我只想要字典输出。

示例数据如下所示......

1234 | 2015-08-24 | 2015-08-25 | null       |
1234 | null       | 2015-08-26 | null       |
2345 | null       | null       | 2015-08-23 |

我希望输出是带有两个键的字典

(3行中的2个键&lt; =来自500,000行的100,000个键),

1234 -> List<DateTime>{2015-08-24, 2015-08-25, 2015-08-26}
and 
2345 -> List<DateTime>{2015-08-23}

我的想法是评估MyQuery.ToList()并将其传递给我的自定义函数将不会非常有效,因为我必须使用ForEach循环遍历50万行。

我错了还是有更好的方法来实现我的目标?

1 个答案:

答案 0 :(得分:2)

看起来你要做的是一个分组过滤null,然后转换为字典:

var dict = MyQuery
    .Select(row => new {row.Id, Dates = new[] {row.Date1, row.Date2, row.Date3}})
    .SelectMany(row => row.Dates.Select(d => new {row.Id, Date=d}))
    .GroupBy(row => row.Id)
    .ToDictionary(g => g.Key, g => g.Select(r => r.Date).ToList());