none
Partition By SQL en LINQ RRS feed

  • Pregunta

  • Buenos días Amigos,

    En esta oportunidad no he encontrado nada en el foro que me ayude a superar este obstaculo pues se trata de lo sisguiente. ROW_NUMBER() OVER(PARTITION BY ....) en sql tengo el siguiente codigo.

    WITH T1 AS (
    SELECT [i],[j],ROW_NUMBER() OVER(ORDER BY [i],[j]) AS RANGO
    FROM (
    		SELECT [Row]
          ,		   [Col]
      FROM [ROAMING].[dbo].[Filas_Columnas]
    	  )  AS T([i],[j])),
    T2 AS (
    			SELECT color,Id
    			FROM (
    			SELECT COLOR,Id FROM COLORES)  
    			AS T(color,Id))
    SELECT
    	A.[i],A.[j],A.rn--,B.color--,B.rn
    FROM
    	(
    	SELECT [i],[j],RANGO, ROW_NUMBER() OVER(PARTITION BY ((RANGO - 1) / 6) ORDER BY RANGO) AS rn
    	FROM T1
    	) AS A
    	INNER JOIN
    	(
    	SELECT color, Id AS rn
    	FROM T2
    	) AS B
    	ON A.rn = B.rn
    ORDER BY
    	A.[i],A.[j]

    generandome lo siguiente

    i    j        rn
    0    4      1
    0    6      2
    0    8      3
    0    10    4
    0    12    5
    1    4      6
    1    6      1
    1    8      2
    1    10    3
    1    12    4

    que me hace el query es realizar el rn de manera que sea particionado en bloques de 6 una vez termine alli el vuelve a comenzar en 1 esto necesito hacerlo en LINQ con un DataSet para crearlo en la interfaz del usuario ya que actualmente lo estoy realizando en el Servidor y me esta consumiendo muchos recursos relentizandome la carga de aplicacion...

    lo que he podido llegar en linq es hacer lo siguiente pero no he podido lograr lo requerido..

    var Select = (from c in Ds.Tables[0].AsEnumerable()
                         select new
                         {
                             Fila = c.Field<int>("Fila"),
                             Columna = c.Field<int>("Columna"),
                         }).ToList();
            var Select2 = Select.AsEnumerable().Select((x, index) => new { 
    Fila = x.Fila, Columa = x.Columna, RowNumber = index++ }).ToList();

    output

    Fila Columa RowNumber
    0 4 1
    0 6 2
    0 8 3
    0 10 4
    0 12 5
    1 4 6
    1 6 7
    1 8 8
    1 10 9
    1 12 10




    Saludos cordiales


    • Editado AngelMP martes, 18 de junio de 2013 13:09 Output Linq
    martes, 18 de junio de 2013 13:00

Respuestas

  • Bueno nada lo resolvi de la siguiente forma creo un dataset el cual tiene tres columnas: Fila,Columna,Rango

    lo recorro con dos bucles

    DataSet DsNuevo = new DataSet();
            DsNuevo.Tables.Add("Nueva");
            DsNuevo.Tables[0].Columns.Add("Fila", typeof(int));
            DsNuevo.Tables[0].Columns.Add("Columna", typeof(int));
            DsNuevo.Tables[0].Columns.Add("Rango", typeof(int));
    
    
            for (int j = 0; j < 6; j++)
            {
                for (int i = j; i < Ds.Tables[0].Rows.Count; i = i + 6)
                {
                    object[] o = { Ds.Tables[0].Rows[i][0], Ds.Tables[0].Rows[i][1], j + 1 };
                    DsNuevo.Tables[0].Rows.Add(o);
                }
            }

    luego a ese dataset le hago el query para obtener el resultado requerido

    Fila Columna Rango
    0 3 1
    0 5 2
    0 7 3
    0 9 4
    0 11 5
    1 3 6
    1 5 1
    1 7 2
    1 9 3
    1 11 4
    2 3 5
    2 5 6
    2 7 1
    2 9 2
    2 11 3
    3 3 4
    3 5 5
    3 7 6

    • Marcado como respuesta AngelMP lunes, 1 de julio de 2013 13:46
    jueves, 20 de junio de 2013 18:18

Todas las respuestas

  • hola

    no te sirce utilizar el Group By de linq, pero este lo usarias con el Into

    var result = from item in lista

                        group item by item.propiedad into g

                         select new {

                              Key = g.Key,

                              Grupo = g.OrderBy(x=>x.propiedad2)

                         }

    esa propiedad grupo contendra el over ordenando lo que agrupa

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    martes, 18 de junio de 2013 15:09
  • Bueno creo que no me funciona hice esto y me sale ahora una sola Columna llamada Fila

            var Select3 = from b in Select2.AsEnumerable()
                          group b by b.RowNumber 
                              into g
                              select new { Fila = g.Key, RowNum = g.OrderBy(x => x.RowNumber) };

    Fila
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16

    martes, 18 de junio de 2013 16:02
  • claro pero recuerda que es una lista dentro de otra

    debes realizar dos loop porque rowNum a su vez contiene otra lista que agrupa

    igulamente veo algo raro, si RowNumber por cada itrem es un valor diferente, entonces no es un group by lo que buscas, porque si los valores de cada registro difieren no hay nada que agrupar


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    martes, 18 de junio de 2013 19:39
  • Si en efecto todos los registros son distintos por eso no es un group by lo que busco sino un ROW_Number() OVER Partition como el SQL server es decir colocarle un rango a cada registro y particionarlo en cada 6 es decir si tengo 20 registros los primeros 6 deben llevar un row number 1,2,3,4,5,6 cuando comience el septimo empiece en 1 hasta llegar a 6 y asi sucesivamente
    martes, 18 de junio de 2013 19:55
  • Bueno nada lo resolvi de la siguiente forma creo un dataset el cual tiene tres columnas: Fila,Columna,Rango

    lo recorro con dos bucles

    DataSet DsNuevo = new DataSet();
            DsNuevo.Tables.Add("Nueva");
            DsNuevo.Tables[0].Columns.Add("Fila", typeof(int));
            DsNuevo.Tables[0].Columns.Add("Columna", typeof(int));
            DsNuevo.Tables[0].Columns.Add("Rango", typeof(int));
    
    
            for (int j = 0; j < 6; j++)
            {
                for (int i = j; i < Ds.Tables[0].Rows.Count; i = i + 6)
                {
                    object[] o = { Ds.Tables[0].Rows[i][0], Ds.Tables[0].Rows[i][1], j + 1 };
                    DsNuevo.Tables[0].Rows.Add(o);
                }
            }

    luego a ese dataset le hago el query para obtener el resultado requerido

    Fila Columna Rango
    0 3 1
    0 5 2
    0 7 3
    0 9 4
    0 11 5
    1 3 6
    1 5 1
    1 7 2
    1 9 3
    1 11 4
    2 3 5
    2 5 6
    2 7 1
    2 9 2
    2 11 3
    3 3 4
    3 5 5
    3 7 6

    • Marcado como respuesta AngelMP lunes, 1 de julio de 2013 13:46
    jueves, 20 de junio de 2013 18:18