1

SharePoint でいくつかのタイマー ジョブを実行する小さなアプリに取り組んでいます。a を使用しforeachてすべてのジョブをループして必要なジョブを選択するのではなく、Linq ステートメントを介して Guid で選択しようとしています。しかし、私はあまり運がありません。これが私がこれまでに持っているものです:

   foreach (SPService service in centralAdmin.Farm.Services)
{
   var traceJob =
       from jobDefinition in service.JobDefinitions
       where jobDefinition.Id == traceGuid
       select jobDefinition;

   SPJobDefinition jobInfo = traceJob as SPJobDefinition
   Console.WriteLine(jobInfo.DisplayName);
 }

編集私が受け取っているエラーは、「NullReferenceException」ですConsole.WriteLine(jobInfo.DisplayName)

LINQ ステートメントを使用するのはこれが初めてなので、何かを見逃していると確信していますが、何が間違っていたのかを理解できませんでした。そうしないと、 のどのプロパティSPJobDefinitionにもアクセスできないため、traceJob を as にキャストします。ヒントや指針をいただければ幸いです。SPJobDefinitiontraceJob

Guid を検索するときに、列挙を編集しても結果が得られません。ただし、次のコードを実行すると:

    foreach (SPJobDefinition jobDefinition in service.JobDefinitions)
    {
     if (jobDefinition.Id == traceGuid)
     {
       jobDefinition.RunNow();
       Console.WriteLine(jobDefinition.DisplayName);
     }
    }

ジョブ定義の表示名である、私が期待するものを正確に引き戻します。これは、問題が Guid の障害や存在しないジョブにあるのではないことを示しているようです。

4

2 に答える 2

1

LINQ は、クエリが常に多くても 1 つの項目を返す場合でも、結果の列挙子を返します。また、LINQ は実際の結果ではなく列挙子を返すため、それを反復処理する必要があります。を呼び出すかToList()FirstOrDefault()または同様の方法で。

代わりに次のステートメントを試してください。

SPJobDefinition jobInfo = traceJob.SingleOrDefault() ?? new SPJobDefinition();

結果オブジェクトはすでに正しい型であるため、キャストは必要ありません。また、LINQ ステートメントが何も返さない (ジョブ情報が存在しない) 場合に備えて、null 合体演算子も使用しました。この場合、参照型のデフォルトであるため、SingleOrDefault()が返されます。null

もちろん、null 合体操作を省略して、null使用する前に確認することもできますjobInfo

于 2012-11-21T16:12:09.643 に答える
1

取得している例外は、as操作が常に失敗するためです。as失敗した場合、例外はスローされず、null が返されるだけです。例外は、その null 値を使用した場合に発生します。

traceJobキャストする必要はまったくありません。を使用varしても、それが実際に変数型であること、またはまったく不明であることを意味するわけではありません。これは単に、コンパイラが の右側の式を見て、=それを使用して (コンパイル時に静的に) その変数の型を判断することを意味します。この場合、カーソルを合わせるvarと、実際にはIEnumerable<SPJobDefinition>. あなたが持っているのは、単一のジョブ定義ではなく、一連のジョブ定義です。FirstFirstOrDefaultSingle、またはを使用して、シーケンスの最初の項目を簡単に取得できますSingleOrDefault。これを行うと、アイテムが 1 つだけになり、キャストする必要がまったくなくなります。

var traceJob =
    (from jobDefinition in service.JobDefinitions
    where jobDefinition.Id == traceGuid
    select jobDefinition)
    .SingleOrDefault();

if(traceJob != null)
    Console.WriteLine(traceJob.DisplayName);
于 2012-11-21T16:23:50.493 に答える