linq to sql оптимизировал группу с несколькими объединениями - PullRequest
2 голосов
/ 21 декабря 2010

Мне нужна помощь в создании более эффективного запроса LINQ:

Table: Positions
-PositionID
-Name

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

Table: PersonPosition
-PersonID
-PositionID

Мне нужен набор результатов, который группирует людей, назначенных на каждую позицию:

PositionID  Person
1           John
            Bob
            Frank

2           Bill
            Tom
            Frank, etc...

Моей первой мыслью было следующееЗапрос LINQ:

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}

Что прекрасно работает, но выдает следующий 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...

Есть ли лучший запрос LINQ, который переводит в более эффективный оператор SQL?

Ответы [ 2 ]

1 голос
/ 21 декабря 2010

У вас уже должны быть отношения, определенные в вашей базе данных, а также в вашем dbml.

Избегайте объединений, когда вам это не нужно;они действительно утомительны.Пусть LINQ-to-SQL сделает это за вас.Примерно так должно работать:

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

или

return context.Positions.Select(pos => 
    new { pos, pos.PersonPositions.Select(pp => pp.Person).ToList() }).ToList();
1 голос
/ 21 декабря 2010

Я совершенно уверен, что вам нужно просто присоединиться к таблицам и выбрать результат, затем вызвать .AsEnumerable () и сгруппировать после этого:

(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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...