Linq分组到列表

时间:2017-03-03 12:13:03

标签: c# linq

我在linq中有以下选择查询:

var something = 
    from te in taskEvidences
    join e in evidences on te.EvidenceId equals e.Id
    join tr in taskRequirements on te.TaskListId equals tr.TaskListId
    join r in newSelectableModule.Requirements on tr.RequirementListId equals r.Requirement.Id
    select new
    {
        Evidence = e,
        RequirementIndices = r.Index
    };

目前它选择一个Evidence对象以及几个Index(int)值,例如我可能会返回5条记录,所有记录都有相同的Evidence对象和5个不同的索引。

我想要做的只是返回带有Evidence对象和List<int>索引的单个记录。我试图使用分组,但我不断从使用中推断出类型错误。这是一次这样的尝试:

group new {e, r} by new {e}
into g
select new
{
    Evidence = g.Key,
    RequirementIndices = g.SelectMany(x => x.r.Index)
};

错误发生在分配给RequirementIndices属性的SelectMany周围。我已经尝试了几个建议我在网上找到了,但没有一个有帮助。我认为这是我的一个小错误,但我现在要盲目代码!

更新

确切错误:

  

无法从用法推断出方法'Enumerable.SelectMany(IEnumerable,Func&gt;)'的类型参数。尝试明确指定类型参数。

2 个答案:

答案 0 :(得分:1)

正如@JeroenvanLangen在我的问题评论中所建议的,我不需要SelectManySelect

var something = 
    from te in taskEvidences
    join e in evidences on te.EvidenceId equals e.Id
    join tr in taskRequirements on te.TaskListId equals tr.TaskListId
    join r in newSelectableModule.Requirements on tr.RequirementListId equals r.Requirement.Id
    group new { e, r } by new { e }
    into g
    select new
    {
        Evidence = g.Key,
        RequirementIndices = g.Select(x => x.r.Index).ToList()
    };

答案 1 :(得分:0)

您应该能够通过避免顶级联接来生成相同的分组结果:

var something = 
    from te in taskEvidences
    join e in evidences on te.EvidenceId equals e.Id
    select new
    {
        Evidence = e,
        RequirementIndices = (
            from tr in taskRequirements
            join r in newSelectableModule.Requirements on tr.RequirementListId equals r.Requirement.Id
            where te.TaskListId equals tr.TaskListId
            select r.Index
        ).ToList()
    };

现在,通过带有连接的相关子查询选择列表,从而消除了创建父记录的“重复”。它应该与原始查询具有相同的性能。