如何在此linq查询where子句中检查空值

时间:2012-11-30 15:42:07

标签: linq

我有一个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();

希望这很简单。

2 个答案:

答案 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")falsex["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}}