2

我有一个 linq 查询来定位 SharePoint 库中的匹配项。如果有一个名为 'MMSTerm' 的自定义属性,它可以正常工作,但如果该属性为空,那么显然我的字符串修改将失败并在命中 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"nullContainsField

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();

由于is&&时短路评估,因此不会评估 。x.Fields.Contains("MMSTerm")falsex["MMSTerm"]

如果x["MMSTerm"]可能包含nulls,您可以使用该""+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 回答