我有一个linq查询来查找SharePoint库中的匹配项。如果有一个名为'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();
希望这很简单。
答案 0 :(得分: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()));
答案 1 :(得分: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")
为false
时x["MMSTerm"]
进行短路评估,因此不会评估x["MMSTerm"]
。
如果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();
技巧来避免空引用异常:
{{1}}