3

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

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

Однако список я запрашивая, список OOTB задачи, существует целый ряд многовариантных полей (статус, приоритет), которые переведены на перечисления. В моих результатах запроса статус элемента задачи возвращается как «_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, 
} 

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

Thanks, MagicAndi.

+0

Кроме того, если кто-то читает это, у кого более 1500 репутации, не могли бы вы добавить новый тег «linq-to-sharepoint»? Благодарю. – MagicAndi

ответ

1

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

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

+0

Джон, извинился за задержку в ответе, принятый в качестве ответа. – MagicAndi

1

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

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

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

3

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

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(); 
     } 
    } 
}