2 Stimmen

linq to sql optimiert eine Gruppe mit mehreren Joins

Ich brauche Hilfe bei der Erstellung einer effizienteren LINQ-Abfrage:

Table: Positions
-PositionID
-Name

Table: Person
-PersonID
-Name, etc...

Table: PersonPosition
-PersonID
-PositionID

Ich benötige eine Ergebnismenge, die die den einzelnen Positionen zugewiesenen Personen gruppiert:

PositionID  Person
1           John
            Bob
            Frank

2           Bill
            Tom
            Frank, etc...

Mein erster Gedanke war diese LINQ-Abfrage:

from perspos in PersonPositions
join pers in Persons            on perspos.PersonID equals pers.PersonID 
group pers by perspos.PositionID into groups
select new {groups.Key, groups}

Das funktioniert gut, führt aber zu folgendem SQL:

SELECT [t0].[PositionID] AS [Key]
FROM [PersonPosition] AS [t0]
INNER JOIN [Person] AS [t1] ON [t0].[PersonID] = [t1].[PersonID]
GROUP BY [t0].[PositionID]
GO

-- Region Parameters
DECLARE @x1 Int = 3
-- EndRegion
SELECT [t1].[PersonID], [t1].[UserID], [t1].[Firstname], [t1].[Lastname], [t1].[Email], [t1].[Phone], [t1].[Mobile], [t1].[Comment], [t1].[Permissions]
FROM [PersonPosition] AS [t0]
INNER JOIN [Person] AS [t1] ON [t0].[PersonID] = [t1].[PersonID]
WHERE @x1 = [t0].[PositionID]
GO

-- Region Parameters
DECLARE @x1 Int = 4
-- EndRegion
SELECT [t1].[PersonID], [t1].[UserID], [t1].[Firstname], [t1].[Lastname], [t1].[Email], [t1].[Phone], [t1].[Mobile], [t1].[Comment], [t1].[Permissions]
FROM [PersonPosition] AS [t0]
INNER JOIN [Person] AS [t1] ON [t0].[PersonID] = [t1].[PersonID]
WHERE @x1 = [t0].[PositionID]
GO

-- Region Parameters
DECLARE @x1 Int = 5
-- EndRegion
SELECT [t1].[PersonID], [t1].[UserID], [t1].[Firstname], [t1].[Lastname], [t1].[Email], [t1].[Phone], [t1].[Mobile], [t1].[Comment], [t1].[Permissions]
FROM [PersonPosition] AS [t0]
INNER JOIN [Person] AS [t1] ON [t0].[PersonID] = [t1].[PersonID]
WHERE @x1 = [t0].[PositionID]
GO

on and on...

Gibt es eine bessere LINQ-Abfrage, die sich in eine effizientere SQL-Anweisung umsetzen lässt?

1voto

J.D. Punkte 2094

Ich bin mir ziemlich sicher, dass Sie einfach die Tabellen verbinden und das Ergebnis auswählen müssen, dann AsEnumerable() aufrufen und danach gruppieren:

(from perspos in PersonPositions
 join pers in Persons
 on perspos.PersonID equals pers.PersonID
 select new { perspos.PositionID, Person = pers })
.AsEnumerable().GroupBy(p => p.PositionID, p => p.Person);

1voto

Kirk Broadhurst Punkte 26286

Sie sollten die Beziehung bereits in Ihrer Datenbank und auch in Ihrer dbml definiert haben.

Vermeiden Sie Joins, wenn Sie es nicht müssen; sie sind wirklich mühsam. Lassen Sie LINQ-to-SQL diese Aufgabe für Sie erledigen. Etwas wie dies sollte funktionieren:

var data = context.PersonPositions
    .Select(pos => new { pos.PositionID, pos.Person });
return data.GroupBy(pos => pos.PositionID);

oder

return context.Positions.Select(pos => 
    new { pos, pos.PersonPositions.Select(pp => pp.Person).ToList() }).ToList();

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X