[英]linq where clause and count result in null exception
除非p.School.SchoolName结果为null,否则下面的代码有效,在这种情况下,它会导致NullReferenceException。
if (ExistingUsers.Where(p => p.StudentID == item.StaffID &&
p.School.SchoolName == item.SchoolID).Count() > 0)
{
// Do stuff.
}
ExistingUsers是一个用户列表:
public List<User> ExistingUsers;
这是stacktrace的相关部分:
System.NullReferenceException:未将对象引用设置为对象的实例。
在System.Linq.Enumerable.WhereListIterator
1.MoveNext()
at System.Linq.Enumerable.Count[TSource](IEnumerable1.MoveNext()
at System.Linq.Enumerable.Count[TSource](IEnumerable1.MoveNext()
1 source)
at System.Linq.Enumerable.Count[TSource](IEnumerable
我应该如何处理这个where子句?
首先十分感谢。
我怀疑p.School
为空,不SchoolName
。 只需在访问SchoolName
之前添加一个空检查。 另外,使用Any()
来检查是否有任何结果而不是Count() > 0
除非你真的需要计数。 这表现得更好,因为并非所有项都被迭代(如果存在的话)。
var result = ExistingUsers.Where(p => p.StudentID == item.StaffID
&& p.School != null
&& p.School.SchoolName == item.SchoolID)
.Any();
if (result) { /* do something */ }
对于所有数据库可空列,我们应该添加空检查或进行简单的比较a == b
而不是a.ToLower() == b.ToLower()
或类似的字符串操作。
我的观察如下:
当它们通过Enumerable LINQ Query迭代以与输入字符串/值进行比较时,任何空值(数据库列)及其上的操作都会引发异常,但Enumerable变为NULL,尽管查询不为null。
如果您想获得空值(所有学生,是否有学校)使用左连接。
在MSDN上有一个很好的例子
如果我没记错的话(目前不在我的开发人员PC上并且无法使用Reflector检查),使用==
运算符会导致调用实例实现 string.Equals(string)
,而不是静态实现String.Equals(string, string)
。
假设你的问题是由于SchoolName
为null,正如你的建议,试试这个:
if (ExistingUsers.Where(
p => p.StudentID == item.StaffID
&& String.Equals( p.School.SchoolName, item.SchoolID)).Count() > 0)
{
// Do stuff.
}
当然,其他答案的评论也是如此:
Any()
而不是Count() > 0
通常会表现得更好 p.School
为null,则需要额外检查 希望这可以帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.