miércoles, 11 de febrero de 2015

Se acabaron las funciones recursivas para definir CAML Queries gracias a Camlex

Algunas veces tienes un número aleatorio de condiciones para incluir en una CAML query y en esos casos yo solía definir las consultas usando una función recursiva que normalmente tenía que debugar unas cuantas veces me funciona siempre a la primera.

El código para este tipo de consultas sería algo así (y este es de los simples):

public List<string> GetSomeInfo(string fieldsToSearch, string contentTypesToSearch)
{
    ...

    var queryval = string.Empty;
    if (contentTypesToSearch.IsNullOrEmpty())
        queryval = string.Format("<Where>" + GenerateFieldsQuery(fieldsToSearch.Split(','), 0) + "</Where>", text);
    else
        queryval = string.Format("<Where><And>" + GenerateCTypesQuery(contentTypesToSearch.Split(','), 0) + GenerateFieldsQuery(fieldsToSearch.Split(','), 0) + "</And></Where>", text);

    var scope = "Scope=\"RecursiveAll\"";

    ...
}

private static string GenerateFieldsQuery(string[] fields, int index)
{
    if (fields.Length == 0) return string.Empty;

    if (fields.Length == index + 1)
        return "<Contains><FieldRef Name='" + fields[index] + "' /><Value Type='Text'>{0}</Value></Contains>";

    return "<Or><Contains><FieldRef Name='" + fields[index] + "' /><Value Type='Text'>{0}</Value></Contains>" + GenerateFieldsQuery(fields, ++index) + "</Or>";
}

private static string GenerateCTypesQuery(string[] cTypes, int index)
{
    if (cTypes.Length == 0) return string.Empty;

    if (cTypes.Length == index + 1)
        return "<Eq><FieldRef Name='ContentType' /><Value Type='Choice'>" + cTypes[index] + "</Value></Eq>";

    return "<Or><Eq><FieldRef Name='ContentType' /><Value Type='Choice'>" + cTypes[index] + "</Value></Eq>" + GenerateCTypesQuery(cTypes, ++index) + "</Or>";
}

Eso era hasta ahora... gracias a Camlex (y gracias a Luis por decírmelo), este código se puede escribir así:

public List<string> GetSomeInfo(string fieldsToSearch, string contentTypesToSearch)
{
    ...

    var queryVal = string.Empty;
    var fieldExtensions = new List<Expression<Func<SPListItem, bool>>>();
    var cTypeExtensions = new List<Expression<Func<SPListItem, bool>>>();

    if (!contentTypesToSearch.IsNullOrEmpty())
    {
        foreach (var cType in contentTypesToSearch.Split(','))
            cTypeExtensions.Add(x => (string)x["ContentType"] == cType);
    }

    foreach (var field in fieldsToSearch.Split(','))
        fieldExtensions.Add(x => ((string)x[field]).Contains(text));

    var expressions = new List<Expression<Func<SPListItem, bool>>>();
    expressions.Add(ExpressionsHelper.CombineOr(cTypeExtensions));
    expressions.Add(ExpressionsHelper.CombineOr(fieldExtensions));

    queryVal = Camlex.Query().WhereAll(expressions).ToString();

    ...
}

Echaré de menos los métodos recursivos... me hacían sentir especial...

jueves, 23 de octubre de 2014

Surface 3 WiFi e Hyper V


Parece que algo no es completamente compatible entre Hyper V y la Surface

Y si has instalado la ultima versión de Visual Studio probablemente habrás notado que tarda más de la cuenta en conectarse al Wi-Fi Por no mencionar que el modo Sleep ha desaparecido...

Para evitar este problema he creado un par de accesos directos en el escritorio, uno para apagar Hyper V y otro para encenderlo cuando de verdad haga falta.

Bastante simple:
Click derecho en el escritorio y seleccionas Nuevo > Acceso Directo
Se abrirá la pantalla para seleccionar el programa al que apunta el acceso directo.

Seleccionamos bcdedit.exe en la carpeta system32.


 
Y finalmente le ponemos un nombre.

Ahora la parte complicada. Hacemos click derecho en el acceso directo que hemos creado y seleccionamos Propiedades.


Para el acceso directo de HyperV On necesitarás este texto en el TextBox Target:
C:\Windows\System32\bcdedit.exe /set hypervisorlaunchtype auto
Para el HyperV Off necesitarás este otro:
C:\Windows\System32\bcdedit.exe /set hypervisorlaunchtype off
Después de hacer este cambio haz click en Popiedades Avanzadas y selecciona Ejecutar como Administrador.



Y por último selecciona un icono bonito para el acceso directo:


Recuerda hacer los accesos directos para HyperV On e HyperV Off.


Y por último recuerda que después de ejecutar estos accesos directos tendrás que reiniciar la máquina para que los cambios tengan efecto.