Domanda

Io sto usando una query LINQ to SharePoint per articoli di ritorno da un elenco SharePoint.

var myOpenTasksQuery = from myTasks in tasks
                       where myTasks.TaskStatus != TaskStatus.Completed
                       select myTasks

Tuttavia, l'elenco sto interrogando, un elenco Attività OOTB, ci sono una serie di campi a scelta multipla (Stato, la priorità), che vengono tradotti in enumerazioni. Nei miei risultati della query, uno status elemento attività viene restituito come "_2Normal", e non come "(2) Normale" come mi sarei aspettato. Vedo nel file proxy generato da SPMetal.exe che c'è una ChoiceAttribute per l'enumerazione stato dell'attività che contiene il valore richiedo:

public enum Priority : int {

    None = 0,

    Invalid = 1,

    [Microsoft.SharePoint.Linq.ChoiceAttribute(Value="(1) High")]
    _1High = 2,

    [Microsoft.SharePoint.Linq.ChoiceAttribute(Value="(2) Normal")]
    _2Normal = 4,

    [Microsoft.SharePoint.Linq.ChoiceAttribute(Value="(3) Low")]
    _3Low = 8,
}

Come faccio a modificare la query precedente per restituire il valore corretto?

Grazie, MagicAndi.

È stato utile?

Soluzione

Sicuramente lo stato elemento di attività viene restituito come un valore di tipo Priority - non è una stringa a tutti. Se si desidera visualizzare che, mi aspetto di avere per convertirlo in una stringa in modo appropriato (possibilmente utilizzando alcuni metodi di supporto che prendono nota dell'attributo applicata ad alcuni valori).

Basta chiamare ToString() su un valore di enumerazione restituirà il nome del valore se ne ha uno, o una rappresentazione di stringa del numero altrimenti. Non si cura di ChoiceAttribute. Ho il sospetto che è quello che sta succedendo qui.

Altri suggerimenti

Prova ad usare questo metodo di estensione per ottenere il valore stringa effettiva della vostra enum.

foreach (var o in  myOpenTasksQuery)
{
    Console.WriteLine(o.Priority.StringValueOf());
}



public static class Extensions
{
    public static string StringValueOf(this Enum value)
    {
        FieldInfo fi = value.GetType().GetField(value.ToString());
        Microsoft.SharePoint.Linq.ChoiceAttribute[] attributes =
            (Microsoft.SharePoint.Linq.ChoiceAttribute[])fi.GetCustomAttributes(
            typeof(Microsoft.SharePoint.Linq.ChoiceAttribute), false);
        if (attributes.Length > 0)
        {
            return attributes[0].Value;
        }
        else
        {
            return value.ToString();
        }
    }
}

Si ricorda che l'interrogazione di un choicefield, come generato da SPMetal per impostazione predefinita, non sarà tradotto in CAML e quindi la vostra attività-lista sarà prima essere completamente caricato in memoria, e interrogato in seguito.

Questa, in breve, significa che come (e se) il vostro task-lista cresce nel tempo, le prestazioni della query scenderà allo stesso modo.

ho, finora, non ha trovato una soluzione per esso ancora (alle prese con esso).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top