2010-11-30 11 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 declaración de LINQ anteriormente realidad devuelve el resultado correcto, pero SQL generado (abajo) no es tan simple como podría serLINQ to SQL distintas y 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] 

yo habría pensado que el sql a continuación es mucho más limpio, pero no estoy seguro de la declaración de linq para lograrlo.

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

Gracias de antemano

+0

¿Ha intentado jugar con el orden de las invocaciones de métodos? Es decir. swap orderby y distinto? – marr75

+0

Impresionante, los intercambió y trabajó un lujo. – Ian

+0

nuevo sql se ve como SELECCIONE DISTINCT [t0]. [IdProg], [t1]. [Programa] DESDE [tbl_Batch] AS [t0] UNIÓN INICIAL [tbl_Program] AS [t1] ENCENDIDO [t0]. [Id. De programa] = [t1]. [ProgramID] – Ian

Respuesta

4

Perfil las dos consultas, la comparación de las estadísticas-IO y el plan de ejecución real. Es completamente posible que no suponga ninguna diferencia para el servidor SQL.

Si realmente quiere un TSQL conocido, utilice ExecuteQuery-of-T y pase el TSQL usted mismo. Quizás también incluya algunos consejos de bloqueo (más comúnmente: NOLOCK)

22

No sé si será útil, pero puede intentar algo como esto;

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

Sí, eso era lo que estaba intentando, pero desafortunadamente el Distinct() elimina por completo el pedido. pero como Reese sugirió si hace esto:. var result = (a partir de o en tabla1 unirse t en tabla2 en o.ProgramID es igual t.ProgramID seleccionar nueva {o.ProgramID, t.Program}) OrdenarPor (t => t.Program) .Distinct(); funciona – Ian

+0

Es bueno saberlo. Gracias –

+0

Y qué tienes que hacer, cuando quieras Ordenar más de un atributo? Algo como esto: OrderBy (t => new {t.Program, t.ProgramName, t.Description}). Distinct(); ? – user1531040

10

He intentado esto y que funciona:

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

Primero haces distinto y luego OrdenarPor, luego trabaja OrdenarPor.