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

上記のクエリを変更して正しい値を返すにはどうすればよいですか?

ありがとう、MagicAndi。

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

Remember that querying a choicefield, as generated by SPMetal by default, will not be translated to CAML and thus your tasks-list will first be completely loaded to memory, and queried afterwards.

This, in short, means that as (and if) your tasks-list grows in time, performance of the query will drop equally.

I have, so far, not found a solution to it yet (struggling with it).

于 2011-08-10T18:52:46.803 に答える
1

Priority確かに、タスクアイテムのステータスは、文字列ではなく、タイプの値として返されます。それを表示したい場合は、適切に文字列に変換する必要があると思います(おそらく、いくつかの値に適用された属性に注意するいくつかのヘルパーメソッドを使用します)。

列挙値を呼び出すだけToString()で、値がある場合はその名前が返され、そうでない場合は数値の文字列表現が返されます。気にしないChoiceAttribute。それがここで起こっていることだと思います。

于 2010-09-22T17:11:31.443 に答える