2010-11-30 8 views
27
var result = table1.Join(table2, o => o.ProgramID, t => t.ProgramID, (o, t) => new { o.ProgramID, t.Program }) 
     .OrderBy(t => t.Program) 
     .Distinct(); 

la déclaration LINQ ci-dessus renvoie en fait le résultat correct, mais il sql généré (ci-dessous) n'est pas aussi simple que cela pourrait êtreLINQ to SQL Distinct et orderBy

SELECT [t2].[ProgramID], [t2].[Program] 
FROM (
    SELECT DISTINCT [t0].[ProgramID], [t1].[Program] 
    FROM [table1] AS [t0] 
    INNER JOIN [table2] AS [t1] ON [t0].[ProgramID] = [t1].[ProgramID] 
    ) AS [t2] 
ORDER BY [t2].[Program] 

j'aurais pensé que le sql ci-dessous est beaucoup plus propre mais je ne suis pas sûr de la déclaration linq pour y parvenir.

select distinct 
    o.ProgramID, 
    t.Program 
from 
    table1 0 
    inner join table2 t on t.ProgramID = o.ProgramID 
order by t.Program 

Merci à l'avance

+0

Avez-vous essayé de jouer avec l'ordre des invocations de méthodes? C'est à dire. swap orderby et distinct? – marr75

+0

Génial, les échangés et a travaillé un régal. – Ian

+0

new sql ressemble à SELECT DISTINCT [t0]. [ID_programme], [t1]. [Programme] FROM [tbl_Batch] AS [t0] INNER JOIN [tbl_Program] AS [t1] ON [t0]. [ID_programme] = [t1]. [ProgramID] – Ian

Répondre

4

Profil les deux requêtes, en comparant les statistiques-IO et le plan d'exécution réelle. Il est tout à fait possible que cela fasse zéro différence avec le serveur SQL.

Si vous voulez vraiment connaître TSQL, utilisez ExecuteQuery-of-T et transmettez vous-même le TSQL. Peut-être inclure quelques astuces de verrouillage aussi (le plus souvent: NOLOCK)

22

Je ne sais pas si cela va vous aider, mais vous pouvez essayer quelque chose comme ça;

var result = (from o in table1 
       join t in table2 on o.ProgramID equals t.ProgramID 
       orderby t.Program 
       select new { o.ProgramID, t.Program }).Distinct(); 
+1

Ouais c'était ce que j'essayais, mais malheureusement le Distinct() efface totalement l'ordre par mais comme Reese suggéré si vous faites cela. var result = (de o dans le tableau 1 rejoindre t table2 sur o.ProgramID est égal à t.ProgramID sélectionnez nouveau {o.ProgramID, t.Program}) OrderBy (t => t.Program) .Distinct(); cela fonctionne – Ian

+0

Bon à savoir Merci –

+0

Et que devez-vous faire, quand vous voulez Commander plus d'un attribut? Quelque chose comme ceci: OrderBy (t => nouveau {t.Program, t.ProgramName, t.Description}). Distinct(); ? – user1531040

10

J'ai essayé ceci et cela fonctionne:

var result = (from o in table1 
       join t in table2 on o.ProgramID equals t.ProgramID 
       select new { o.ProgramID, t.Program }) 
       .Distinct().OrderBy(t => t.Program) 
         .ThenBy(t => t.ProgramName) 
         .ThenBy(t => t.Description); 

D'abord, vous faites Distinct puis OrderBy, puis fonctionne OrderBy.