在LINQ to SharePoint Query中更正MultiChoice值

时间:2010-09-22 17:04:02

标签: linq sharepoint sharepoint-2010 enumeration linq-to-sharepoint

我正在使用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,
}

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

谢谢,MagicAndi。

3 个答案:

答案 0 :(得分: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();
        }
    }
}

答案 1 :(得分:1)

当然,任务项状态将返回为Priority类型的值 - 根本不是字符串。如果你想显示它,我希望你必须适当地将它转换成一个字符串(可能使用一些辅助方法,注意应用于某些值的属性)。

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

答案 2 :(得分:1)

请记住,查询某个选项字段(默认情况下由SPMetal生成)将不会转换为CAML,因此您的任务列表将首先完全加载到内存中,然后查询。

简而言之,这意味着当您的任务列表及时增长时,查询的性能将同等下降。

到目前为止,我还没有找到解决办法(努力解决它)。