Herramientas de usuario

Herramientas del sitio


fw:othersnet:linq

Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

Ambos lados, revisión anterior Revisión previa
Próxima revisión
Revisión previa
fw:othersnet:linq [2009/03/23 08:18]
alfred
fw:othersnet:linq [2020/05/09 09:25] (actual)
Línea 76: Línea 76:
  
 ===== Ejemplos ===== ===== Ejemplos =====
 +
 ==== Sencillos ==== ==== Sencillos ====
 === Where + and === === Where + and ===
Línea 105: Línea 106:
         from n in numbers         from n in numbers
         select strings[n];         select strings[n];
-<​code ​csharp>+</code>
 Devolvería five, four, one... Devolvería five, four, one...
  
Línea 135: Línea 136:
                         };                         };
 </​code>​ </​code>​
 +
 ==== Tipado anónimo ==== ==== Tipado anónimo ====
 <code csharp> <code csharp>
Línea 175: Línea 177:
         select new {c.CustomerID,​ o.OrderID};         select new {c.CustomerID,​ o.OrderID};
 </​code>​ </​code>​
 +
 ==== Ordenación ==== ==== Ordenación ====
 === Orderby === === Orderby ===
Línea 183: Línea 186:
         select w;         select w;
 </​code>​ </​code>​
 +
 +=== Orderby Descending ===
 +<code csharp>
 +var sortedWords =
 +        from w in words
 +        orderby w.Length descending
 +        select w;
 +</​code>​
 +
 === Cambiar el orden === === Cambiar el orden ===
 <code csharp> <code csharp>
Línea 191: Línea 203:
         .Reverse();         .Reverse();
 </​code>​ </​code>​
 +
 ==== Contar elementos ==== ==== Contar elementos ====
  
Línea 236: Línea 249:
         .ElementAt(3);​         .ElementAt(3);​
 </​code>​ </​code>​
 +
  
 ===== Nuevas funciones ===== ===== Nuevas funciones =====
-Nuevas funciones+==== Range ====
 Generación de los números de 100 a 150: Generación de los números de 100 a 150:
 +<code csharp>
 from n in Sequence.Range(100,​ 50)  from n in Sequence.Range(100,​ 50) 
 +</​code>​ 
 +==== Repeat ====
 Repetición del número 7, 10 veces: Repetición del número 7, 10 veces:
 +<code csharp>
 var numbers = Sequence.Repeat(7,​ 10);  var numbers = Sequence.Repeat(7,​ 10); 
 +</​code>​
  
-Función ​Distinct+==== Distinct ​====
 Coge sólo uno, esquivando los elementos duplicados Coge sólo uno, esquivando los elementos duplicados
 +<code csharp>
 var categoryNames = ( var categoryNames = (
         from p in products         from p in products
         select p.Category)         select p.Category)
         .Distinct();​         .Distinct();​
- +</​code>​ 
-Función ​Union+==== Union ====
 Une dos listas del mismo tipo Une dos listas del mismo tipo
 +<code csharp>
 var uniqueNumbers = numbersA.Union(numbersB);​ var uniqueNumbers = numbersA.Union(numbersB);​
 +</​code>​
  
-Función ​Intersect+==== Intersect ​====
 Coge los elementos que se repiten en las dos listas Coge los elementos que se repiten en las dos listas
 +<code csharp>
 var commonNumbers = numbersA.Intersect(numbersB);​ var commonNumbers = numbersA.Intersect(numbersB);​
- +</​code>​ 
-Función ​Except+==== Except ​====
 Coge los elementos de la primera lista que no esten en la segunda Coge los elementos de la primera lista que no esten en la segunda
 +<code csharp>
 IEnumerable<​int>​ aOnlyNumbers = numbersA.Except(numbersB);​ IEnumerable<​int>​ aOnlyNumbers = numbersA.Except(numbersB);​
- +</​code>​ 
-Función ​Take+==== Take ====
 Coge los primeros valores Coge los primeros valores
 +<code csharp>
 var first3Numbers = numbers.Take(3);​ var first3Numbers = numbers.Take(3);​
 +</​code>​ 
 +<code csharp>
 var first3WAOrders = ( var first3WAOrders = (
                 from c in customers                 from c in customers
Línea 274: Línea 299:
                 select new {c.CustomerID,​ o.OrderID, o.OrderDate} )                 select new {c.CustomerID,​ o.OrderID, o.OrderDate} )
                 .Take(3);                 .Take(3);
 +</​code>​
  
-Función ​Skip+ 
 +==== Skip ====
 Coge los últimos números saltandose los indicados Coge los últimos números saltandose los indicados
 +<code csharp>
 var allButFirst4Numbers = numbers.Skip(4);​ var allButFirst4Numbers = numbers.Skip(4);​
- +</​code>​ 
-Combinación de skip y take+=== Combinación de skip y take === 
 +<code csharp>
 query.Skip(30).Take(10) query.Skip(30).Take(10)
-===== Notas =====+</​code>​
  
 +
 +
 +===== Otros =====
 +
 +
 +==== let ====
 +La clausula ''​let''​ permite crear una variable dentro del ámbito de la query y utilizarla en la condición. ​
 +
 +<code csharp>
 +var lArrivals = from a in db.PIU_ARRIVALS
 +                let t = (DateTime.Now - a.updatedLocalTime)
 +                where (t.Seconds > seconds)
 +                select a;
 +</​code>​
 +... O ...
 +<code csharp>
 +from car in root.Elements("​car"​)
 +let profiles =
 +  from profile in car.Elements("​profile"​)
 +  select new {
 +    Name = profile.Attribute("​name"​).Value,​
 +    Value = profile.Attribute("​value"​).Value
 +  }
 +let supports =
 +  from support in car.Elements("​support"​)
 +  select new {
 +    Name = support.Attribute("​name"​).Value,​
 +    Value = support.Attribute("​value"​).Value
 +  }
 +select new Car {
 +  Name = car.Attribute("​name"​).Value,​
 +  Vendor = profiles.Single(prof => prof.Name == "​Vendor"​).Value,​
 +  Model = profiles.Single(prof => prof.Name == "​Model"​).Value,​
 +  Doors = int.Parse(profiles.Single(prof => prof.Name == "​Doors"​).Value),​
 +  RacingSupport = supports.Single(sup => sup.Name == "​Racing"​).Value == "​yes"​
 +};
 +</​code>​
 +
 +
 +
 +
 +===== Ejemplos =====
 +=== Ejemplo 1 ===
 +SQL:
 +<code sql>
 +SELECT SAE_LINEASPIENPANELINFO.INUMEROORDEN,​ SAE_LINEASPIENPANELINFO.SNOMBRELINEA,​ SAE_LINEASPIENPANELINFO.SNOMBREDESTINO, ​
 +            SAE_LINEASPIENPANELINFO.IIDLINEA,​ SAE_LINEASPIENPANELINFO.IIDTRAYECTO,​ SAE_LINEASPIENPANELINFO.IIDPARADA
 +FROM SAE_LINEASPIENPANELINFO,​ SAE_CONFBIENPROGRAMADAS
 +WHERE SAE_LINEASPIENPANELINFO.IIDPARADA = {0} AND SAE_LINEASPIENPANELINFO.IIDPANELINFO = {1} 
 +            AND SAE_CONFBIENPROGRAMADAS.IIDCONFLINEASACTUAL = SAE_LINEASPIENPANELINFO.IIDCONFIGURACIONLINEASPI ​
 +            AND SAE_CONFBIENPROGRAMADAS.IIDPANELINFO = {1}
 +ORDER BY SAE_LINEASPIENPANELINFO.INUMEROORDEN
 +</​code>​
 +LINQ:
 +<code csharp>
 +var dades = from linies in dbdc.SAE_LINEASPIENPANELINFO
 +            from conf in dbdc.SAE_CONFBIENPROGRAMADAS
 +            orderby linies.INUMEROORDEN
 +            where ((linies.IIDPARADA == p.IIDPARADA) &&
 +                (linies.IIDPANELINFO == codi) &&
 +                (conf.IIDCONFLINEASACTUAL == linies.IIDCONFIGURACIONLINEASPI) && ​
 +                (conf.IIDPANELINFO == codi))
 +            select new 
 +            {
 +                INUMEROORDEN = linies.INUMEROORDEN,​
 +                SNOMBRELINEA = linies.SNOMBRELINEA,​
 +                SNOMBREDESTINO = linies.SNOMBREDESTINO,​
 +                IIDLINEA = linies.IIDLINEA,​
 +                IIDTRAYECTO = linies.IIDTRAYECTO,​
 +                IIDPARADA = linies.IIDPARADA
 +            };
 +</​code>​
 +=== Ejemplo 2 (combinación) ===
 +Esto...
 +<​code>​
 +var id_paradas = (from pt in db.SAE_PARADASTRAYECTO
 +                       where (pt.IIDLINEA == idLinia)
 +                       ​select pt.IIDPARADA.GetValueOrDefault(-1)).Distinct();​
 +
 +return (from p in db.SAE_PARADAS
 +        from id in id_paradas
 +        where (p.IIDPARADA == id)
 +        select p).ToList();​
 +</​code>​
 +Es igual a...
 +<​code>​
 +return (from p in db.SAE_PARADAS
 +        from id in ((from pt in db.SAE_PARADASTRAYECTO
 +                       where (pt.IIDLINEA == idLinia)
 +                       ​select pt.IIDPARADA.GetValueOrDefault(-1)).Distinct())
 +        where (p.IIDPARADA == id)
 +        select p).ToList();​
 +</​code>​
 +=== Ejemplo 3 (NOT IN) ===
 +<​code>​
 +var query =
 +    from c in dc.Customers
 +    where !(from o in dc.Orders
 +            select o.CustomerID)
 +           ​.Contains(c.CustomerID)
 +    select c;
 +foreach (var c in query) Console.WriteLine( c );
 +</​code>​
 +=== Ejemplo 4 (FindAll y ForEach) ===
 +<​code>​
 +static void DisplayInstalledApplications2()
 +{
 +  string registryKey =
 +    @"​SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall";​
 +
 +  using (Microsoft.Win32.RegistryKey key = 
 +    Registry.LocalMachine.OpenSubKey(registryKey))
 +  {
 +    (from a in key.GetSubKeyNames()
 +      let r = key.OpenSubKey(a)
 +      select new
 +      {
 +        Application = r.GetValue("​DisplayName"​)
 +      }).ToList()
 +      .FindAll(c => c.Application != null)
 +      .ForEach(c => Console.WriteLine(c.Application));​
 +  }
 +}
 +</​code>​
 +=== Cálculo del tamaño de un directorio ===
 +<code csharp>
 +static long DirectorySize(DirectoryInfo dInfo, bool includeSubDir) {
 +  // Enumerate all the files
 +  long totalSize = dInfo.EnumerateFiles()
 +    .Sum(file => file.Length);​
 +  // If Subdirectories are to be included
 +  if (includeSubDir)
 +  {
 +    // Enumerate all sub-directories
 +    totalSize += dInfo.EnumerateDirectories()
 +      .Sum(dir => DirectorySize(dir,​ true));
 +  }
 +  return totalSize;
 +}
 +</​code>​
 +
 +===== Notas =====
 +  * En las querys LINQ podemos ver el código SQL generado; si se debuga se puede ver el comando sql en la variable a la que se le ha asignado dicha query.
 +  * El resultado de una sentencia LINQ puede ser asignada a un ''​DataSource''​ de un ''​GridView''​. Luego tendremos que llamar al método ''​DataBind''​ para que se muestren.
fw/othersnet/linq.1237796327.txt.gz · Última modificación: 2020/05/09 09:24 (editor externo)