2017-03-03 4 views
0

Ich habe die folgende SELECT-Abfrage in Linq:Linq Gruppierung in Liste

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 
    }; 

Derzeit ist es Aufgabe, einen Nachweis zusammen mit mehreren Index (int) Werte, so zum Beispiel wählt I 5 Datensätze zurück bekommen könnte, die alle mit das gleiche Evidence-Objekt und 5 verschiedene Indizes.

Was ich tun möchte, nur einen einzigen Datensatz mit dem Evidence-Objekt und einem List<int> der Indizes zurückgeben. Ich habe versucht, Gruppierung zu verwenden, aber ich bekomme immer Fehler über den Typ kann nicht aus der Verwendung abgeleitet werden. Dies ist ein solcher Versuch:

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

Der Fehler tritt auf um die SelectMany zum RequirementIndices Eigenschaft zugeordnet ist. Ich habe mehrere Vorschläge ausprobiert, die ich online gefunden habe, aber keiner von ihnen hat geholfen. Ich nehme an, es ist ein kleiner Fehler von mir, aber ich gehe jetzt Code blind!

Update:

Genaue Fehler:

The type arguments for method 'Enumerable.SelectMany(IEnumerable, Func>)' cannot be inferred from the usage. Try specifying the type arguments explicitly.

+4

Also, was ist der genaue Fehler? A [mcve] würde es viel einfacher machen, dir zu helfen. –

+1

'SelectMany' soll eine Liste von Listen reduzieren. Bei der Verknüpfung von Tabellen werden Listen nicht in Listen verschachtelt. Was ist, wenn Sie es in "Auswählen" ändern? BTW, 'r' scheint Teil der Gruppierung zu sein. –

+0

@JonSkeet Ich habe die Frage mit dem genauen Fehler aktualisiert. – XN16

Antwort

1

Als @JeroenvanLangen auf meine Frage in dem Kommentar vorgeschlagen, habe ich nicht SelectMany brauchen nur ein Select:

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() 
    }; 
0

Sie sollten in der Lage sein, dasselbe gruppierte Ergebnis zu erzeugen, indem Sie einen Join auf der obersten Ebene vermeiden:

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() 
    }; 

Jetzt wird die Liste durch eine korrelierte Unterabfrage mit einem Join ausgewählt, die Schaffung von „Dubletten“ des übergeordneten Datensatz eliminiert. Es sollte die gleiche Leistung wie die ursprüngliche Abfrage haben.