Исправьте значения MultiChoice в запросе LINQ to SharePoint - PullRequest
3 голосов
/ 22 сентября 2010

Я использую запрос LINQ to SharePoint для возврата элементов из списка SharePoint.

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

Однако в списке, который я запрашиваю, в списке задач OOTB, есть несколько полей с множественным выбором (Status, Priority), которые переводятся в перечисления. В моих результатах запроса статус элемента задачи возвращается как "_2Normal", а не как "(2) Normal", как я ожидал. В файле прокси-сервера, созданного программой SPMetal.exe, я вижу, что для перечисления состояния задачи есть атрибут ChoiceAttribute, содержащий требуемое значение:

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,
}

Как я могу изменить запрос выше, чтобы вернуть правильное значение?

Спасибо, MagicAndi.

Ответы [ 3 ]

3 голосов
/ 16 декабря 2011

Попробуйте использовать этот метод расширения, чтобы получить фактическое строковое значение вашего перечисления.

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();
        }
    }
}
1 голос
/ 10 августа 2011

Помните, что запрос поля выбора, сгенерированного SPMetal по умолчанию, не будет переведен в CAML, и, таким образом, ваш список задач сначала будет полностью загружен в память, а затем запрошен.

Это, вкратце, означает, что по мере того, как (и если) ваш список задач со временем растет, производительность запроса будет падать в равной степени.

Я до сих пор не нашел его решения (борюсь с ним).

1 голос
/ 22 сентября 2010

Конечно, статус элемента задачи возвращается как значение типа Priority - не строка вообще.Если вы хотите отобразить это, я ожидаю, что вам придется преобразовать его в строку соответствующим образом (возможно, с использованием некоторых вспомогательных методов, которые принимают к сведению атрибут, примененный к некоторым значениям).

Просто вызов ToString()в значении перечисления вернет имя значения, если оно есть, или строковое представление числа в противном случае.Это не будет заботиться о ChoiceAttribute.Я подозреваю, что это то, что здесь происходит.

...