我正在使用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。
答案 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,因此您的任务列表将首先完全加载到内存中,然后查询。
简而言之,这意味着当您的任务列表及时增长时,查询的性能将同等下降。
到目前为止,我还没有找到解决办法(努力解决它)。