2

SharePoint ライブラリで一致するアイテムを見つけるための linq クエリがあります。「MMSTerm」というカスタム プロパティがある場合は正常に動作しますが、プロパティが null の場合、明らかに文字列の変更は失敗し、x["MMSTerm"] にヒットするとエラーになります。

where 操作で string.replace を使用する必要があるため、null は適切ではありません。

SPListItem item = (from x in Items.OfType<SPListItem>()
                where x["MMSTerm"].ToString() == pageReference.ToString()
                select x).ToList<SPListItem>().FirstOrDefault();

うまくいけば、これは簡単なものです。

4

2 に答える 2

2

フィールドが存在するかどうかはSPFieldCollection.ContainsFieldメソッドで確認できます

SPListItem item = (from x in Items.OfType<SPListItem>()
                   where x.Fields.ContainsField("MMSTerm") && 
                         (x["MMSTerm"] == null ||
                          x["MMSTerm"].ToString() == pageReference.ToString())
                   select x).FirstOrDefault();

また、この場合、流暢な API の方が見栄えが良いと思います。

SPListItem item = Items.OfType<SPListItem>()
                       .FirstOrDefault(x => 
                           x.Fields.ContainsField("MMSTerm") &&
                          (x["MMSTerm"] == null ||
                           x["MMSTerm"].ToString() == pageReference.ToString()));
于 2012-11-30T15:46:35.767 に答える
1

が存在しない場合に呼び出すとx["MMSTerm"]例外がスローされるため、 を"MMSTerm"返すのではなく、null呼び出す必要があります。ContainsField

x.Fields.ContainsField("MMSTerm")

フィールドがあるかどうかを確認するには:

SPListItem item = (from x in Items.OfType<SPListItem>()
            where x.Fields.ContainsField("MMSTerm") && x["MMSTerm"].ToString() == pageReference.ToString()
            select x).FirstOrDefault();

が の場合は&&評価が短絡するため、は評価されません。x.Fields.Contains("MMSTerm")falsex["MMSTerm"]

にsx["MMSTerm"]が含まれている可能性がある場合は、次のトリックを使用して null 参照の例外を回避できます。null""+obj

var pageRefStr = pageReference.ToString();
SPListItem item = (from x in Items.OfType<SPListItem>()
            where x.Fields.ContainsField("MMSTerm") && pageRefStr.Equals(""+x["MMSTerm"])
            select x).FirstOrDefault();
于 2012-11-30T15:49:03.453 に答える