Empezamos con LINQ

Explicadas algunas de las novedades en los lenguajes en la versión 3.0 del Framework

Inicialización de objetos, Tipos inferidos, Tipos anonimos, Extensión de métodos

ya podemos mirarnos una sentencia LINQ y comprenderla paso a paso.

C#
var customquery =
from cust in customers
where (cust.City == “London” && cust.Balance > 500)
orderby cust.Balance descending
select new {Details=cust.Name + “:” + cust.Phone,
cust.Balance};
foreach(var custItem in customerQuery){
  Console.WriteLine(custItem.Details);
  Console.WriteLine(custItem.Balance);
}

Vb.Net
Dim customquery =
From cust In customers
Where (cust.City = “London” and cust.Balance > 500)
Order By cust.Balance Descending
Select new With {Details=cust.Name + “:” + cust.Phone,
cust.Balance}
For Each custItem In customerQuery
  Console.WriteLine(custItem.Details)
  Console.WriteLine(custItem.Balance)
Next

LINQ es la instrucción que empieza por From y termina en Select y como puedes ver es una sintaxis muy parecida a SQL estándard y su objetivo es buscar o filtrar listas de elementos. Más adelante verás que las listas no tienen porque ser colecciones en memoria, también pueden ser bases de datos.

Desmontando la sentencia

  • customquery : Tipo inferido por el resultado de la instrucción LINQ. En este caso un IEnumerable de un tipo anónimo tal y como puedes ver en la parte del Select.
  • cust : tipo inferido por los elementos de la colección customers. En el ejemplo se puede deducir que es algún tipo Customer.
  • Where : Expresión booleana para determinar que elementos queremos
  • Order By : Determina el orden en el resultado
  • Select : Tipo que queremos devolver en la instrucción LINQ. En este caso se trata de un tipo anónimo. No es necesario siempre devolver tipos anónimos, fijate que una instrucción como la siguiente devuelve los mismos elementos de la lista ordenados.
C#
var customquery =
from cust in customers
orderby cust.Balance descending
select cust;

Vb.Net
Dim customquery =
From cust In customers
Order By cust.Balance Descending
Select cust

Donde se aplica LINQ
LINQ es una extensión de método de la interfaz IEnumerable, por tanto, podemos aplicar LINQ en todas las colecciones que implementen esta interfaz que son prácticamente todas.

Que devuelve LINQ
Toda expresión LINQ devuelve un IEnumerable genérico, es decir un IEnumerable<T>, con una excepción, si devolvemos tipos anónimos entonces seria un IEnumerable de anónimos, pero como no puedo declarar una variable de ese tipo se trata con var o Dim tal y como has visto en el primer ejemplo. Ahora puedes ver como definimos el tipo devuelto en el segundo ejemplo:

C#
IEnumerable<Customer> customquery =
from cust in customers
orderby cust.Balance descending
select cust;

Vb.Net
Dim customquery as IEnumerable(Of Customer)
customquery =
From cust In customers
Order By cust.Balance Descending
Select cust
Anuncis

Fitxer de logs de la base de dades de Sharepoint

En una instal·lació del Sharepoint Wss 3.0 que estic treballant ens hem trobat amb el problema del fitxer de logs de la base de dades. Aquest tenia una mida de més de 30 GB i que evidentment s’havia de reduir d’alguna manera.

Des de SQL Server s’ha provat de reduir la mida utilitzant la opció de compactar (shrink) i sempre hem fracassat. La solució ha sigut utilitzar el que proposa Michael Van Cleave des del seu blog.

Es tracta primer de canviar el tipus de log de la base de dades, passar de ser un log Full a ser un log simple. Fent aquest hem de ser conscients del que realment estem perdent i si ho acceptem és la millor manera de reduïr dràsticament la mida.

Des de la web de Microsoft es pot consultar les diferències que hi ha entre els dos models.

Per tant tal i com diu ell i és el que a mi m’ha funcionat:

1) Canviem el model de recuperació a simple

2) Després compactem el log

Canviant el model de recuperació aquest log es reduirà cada vegada que fem una copia de seguretat.

Extensión de métodos

Las extensiones de métodos nos permiten añadir funciones o métodos en tipos ya existentes.

C#
namespace StringExtensionMethodStringExtensionMethods{
 public static class Extension{
  public static int CountWords(this string s){
   return s.Split(new Char() {" "c,"."c).Lenght;
  }
 }
}
Vb.Net
Namespace StringExtensionMethods
 public Module StringExtensions
  <Extension>
  Public Function CountWords(s as string) as Integer
   Return s.Split(new Char() {" "c,"."c).Lenght
  End Function
 End Module
End Namespace

En el ejemplo puedes comprobar como creamos un método que cuenta las palabras del string. Es un método que extiende el tipo string.
Las condiciones que se deben cumplir para crear un método de extensión son:
1. Declaración de un espacio de nombres
2. C# Clase estática / Visual Basic Modulo
3. C# Método estático / Visual Basic Método con atributo Extension
4. C# Primer parámetro con this

Sea cual sea su declaración posibilita usarlo en el tipo string tal y como puedes ver aquí:

C#
using StringExtensionMethods;
string message = "Hi there delegates"
int i = message.CountWords();
Vb.Net
Imports StringExtensionMethods
Dim message = "Hi there delegates"
Dim i = message.CountWords()

Contar els caràcters escrits a una caixa de text amb Silverlight

Silverlight és una tecnologia completament integrada amb .NET que utilitza XAML com a llenguatge per definir la interficia. Aquest llenguatges està dins les llibreries que conformen WPF. XAML és un llenguatge estructurat com un XML que permet definir els components gràfics juntament amb els seus estils, events i triggers.

Una cosa tant senzilla com és contar els caràcters que escrivim a una caixa de text que amb Html hem de fer ús de una llibreria Javascript amb XAML utilitzem el concepte d’enllaç de dades (databinding).

El següent codi XAML mostra una caixa de text juntament amb una etiqueta que mostra el numero de caràcters escrits. La manera és enllaçar l’etiqueta amb la propietat Length del control TextBox.

<StackPanel Orientation="Vertical" Margin="50">
  <TextBlock Text="Tweet (max 140 characters)" />
  <TextBox x:Name="tweetText" MaxLength="140"  Text="Right now I'm writing a book" />   
<StackPanel Orientation="Horizontal">
    <TextBlock Text="{Binding Text.Length, ElementName=tweetText}" />
    <TextBlock Text="/" />
    <TextBlock Text="{Binding MaxLength, ElementName=tweetText}" />
  </StackPanel>
 </StackPanel>

Que fàcil oi? Aquest és el resultat.

La font està al blog http://10rem.net/blog/2009/06/24/from-silverlight-in-action-2nd-edition-ui-element-binding

Novedades en el lenguaje .Net 3 – Tipo anónimo

Tercera parte de las novedades en los lenguajes C# y VB.NET del .Net 3. Consultar las otras partes: Inicialización de objetos, tipos inferidos.

.Net es fuertemente tipificado, eso significa que una variable es de un tipo desde su declaración hasta su eliminación. Con la aparición del tipo anónimo parece que no se cumpla con esa condición pero no es así. Continua siendo un tipo, el tipo anónimo, lo único que no podemos darle un nombre, no podemos declarar la variable con un nombre de tipo. Es por eso que necesitamos obligatoriamente declararlo con var (en C# o Dim en Visual Basic).

C#
var p1 = new {FirstName=”Jon”,LastName=”Smith”,Age=32};

Vb.Net
Dim p1 = new With {.FirstName=”Jon”,
                   .LastName=”Smith”,
                   .Age=32}

Los tipos anónimos nos permiten poder declarar estructuras sin necesidad de declaraciones. La única condición es que las propiedades se definen en el momento que construimos el tipos anónimo.

Fijate en el ejemplo como p1 es una instancia de un tipo anónimo que tiene 3 propiedades : FirstName, LastName y Age. Después de esa declaración ya no es posible añadir ninguna propiedad más.

ASP.NET Profiles : Modificar els d’un altre usuari

Els profiles d’ASP.NET crec que és una bona manera de poder guardar informació d’usuari fàcil i ràpidament. Fins ara tractar els profiles de l’usuari que està validat en el context actual era la situació més comuna. Però avui m’he trobat amb el problema de tenir que actualitzar el perfil d’un altre usuari que no sigui el que està validat en el context actual. Per fer una acció tant simple el que hem de fer és crear una instancia de ProfileBase amb l’usuari que volem tractar

System.Web.Profile.ProfileBase pb = System.Web.Profile.ProfileBase.Create(username);

Un cop creat el ProfileBase accedim i modifiquem els profiles que té l’usuari

pb.SetPropertyValue("profilename", "profilevalue");

Al final no ens podem oblidar de guardar els canvis.

pb.Save();