2010-09-28 5 views
0

L'instruction linq suivante génère plusieurs déplacements dans la base de données. Y a-t-il un moyen de changer cela afin de le faire en un seul déplacement?Linq-to-sql génère une requête SQL unique avec distinct()

db.Members.Distinct().Select(
    m => new { 
     Id = m.Id, 
     PlayTimeSchedules = m.PlayTimeSchedules.Select(pts => pts.DayOfWeek) } 
).ToList(); 

FYI: dans cet exemple, Distinct est redondant.

Il y a un à plusieurs entre un membre et son PlayTimeSchedule

Je me attends quelque chose comme suit à générer:

select distinct(Members.Id), PlayTimeSchedule.DayOfWeek from Members 
join PlayTimeSchedule on PlayTimeSchedule.MemberId = Members.Id 

ou suis-je coincé avec la création d'une vue si je veux c'est fait en un voyage?

EDIT: Voici ce que ci-dessus LINQ génère (j'ai ajouté .Take (20) par souci de concision):

SELECT TOP (20) [t1].[Id] 
    FROM (
     SELECT DISTINCT [t0].[Id], [t0].[EMail], [t0].[Username], [t0].[Password], [t0].[GmtOffset], [t0].[LastSeen], [t0].[Notifications], [t0].[EMailVer 
    ified], [t0].[ObserveDst], [t0].[Admin], [t0].[AttendedRaidCount], [t0].[MissedRaidCount], [t0].[LedRaidCount], [t0].[CommittedRaidCount] 
     FROM [dbo].[Members] AS [t0] 
     ) AS [t1] 
    -- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 3.5.30729.1 

    SELECT [t0].[DayOfWeek] 
    FROM [dbo].[PlayTimeSchedule] AS [t0] 
    WHERE [t0].[MemberId] = @x1 
    -- @x1: Input Int (Size = 0; Prec = 0; Scale = 0) [1] 
    -- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 3.5.30729.1 

    SELECT [t0].[DayOfWeek] 
    FROM [dbo].[PlayTimeSchedule] AS [t0] 
    WHERE [t0].[MemberId] = @x1 
    -- @x1: Input Int (Size = 0; Prec = 0; Scale = 0) [2] 
    -- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 3.5.30729.1 

    +++ 18 more DayOfWeek selections as above 
+0

Alors, qu'est-ce que * SQL * génère-t-il? –

Répondre

1

.Select ne fera pas une jointure (qui est ce que vous voulez), utilisez .Join ou si cela le rend plus facile, utilisez la méthode non-lambda:

var query = (from m in db.Members 
      join s in db.PlayTimeSchedules on m.Id equals s.MemberId 
      select new { Id = m.Id, PlayTimeSchedules = s.DayOfWeek }).Distinct(); 
+0

est-il 'de m dans db.Members.Distinct()'? Je reçois une erreur à '{Id = m.Id.Distinct(),' –

+0

cela le fait en un seul voyage, mais sûrement pas joli: 'db.Members.Distinct(). Join (db.PlayTimeSchedules, m = > m.Id, pts => pts.MemberId, (m, pts) => nouveau {Id = m.Id, PlayTimeSchedules = pts.DayOfWeek}). ToList(). GroupBy (item => item.Id, items = > items.PlayTimeSchedules) .Sélectionnez (group => new {Id = groupe.Key, PlayTimeSchedules = groupe}). Take (20) .ToList(); ' Si je dépose ToList avant GroupBy - je me retrouve avec plusieurs trajets. Je me demande pourquoi. –

+0

voir mon édition en ce qui concerne DISTINCT, mais il semble que votre requête est plus compliquée que nous le pensons. Pouvez-vous faire apparaître le T-SQL que vous voulez exécuter dans LinqPad, et voir ce qu'il vous dit? – RPM1984