3

我正在使用 LINQ to SharePoint 查询从 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,
}

如何修改上面的查询以返回正确的值?

谢谢,魔术师安迪。

4

3 回答 3

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();
        }
    }
}
于 2011-12-15T23:49:28.113 回答
1

当然,任务项状态是作为类型值返回的Priority——根本不是字符串。如果您想显示它,我希望您必须将其适当地转换为字符串(可能使用一些帮助方法来记录应用于某些值的属性)。

仅调用ToString()枚举值将返回值的名称(如果它有一个),否则返回数字的字符串表示形式。它不会在意的ChoiceAttribute。我怀疑这就是这里发生的事情。

于 2010-09-22T17:11:31.443 回答
1

请记住,查询由 SPMetal 默认生成的选择字段不会被转换为 CAML,因此您的任务列表将首先完全加载到内存中,然后再进行查询。

简而言之,这意味着随着(如果)您的任务列表随时间增长,查询的性能将同样下降。

到目前为止,我还没有找到解决方案(苦苦挣扎)。

于 2011-08-10T18:52:46.803 回答