Linq where子句导致异常
本文关键字:异常 子句 where Linq | 更新日期: 2023-09-27 18:03:19
var nextItem = ql.Fragments.Where(x => x.AddedToFinal.Equals(false));
x。adddedtofinal是bool值,而ql.Fragments不是空值这个linq语句偶尔会得到这样的异常:
系统。NullReferenceException:对象引用没有设置为实例
at System.Linq.Enumerable.WhereListIterator1.MoveNext() atSystem.Linq.Enumerable。数(TSource) (IEnumerable1源)
有一个问题应该已经回答了这个(linq where子句和count导致null异常),但这是不可能的,因为该字段是一个非空布尔值,这不是一个数据库对象,它是一个列表
只是补充道:我填充列表的代码是多线程的。不同的片段在从db中检索到项目后向列表中添加项目:
…
xe = XElement.Parse(result);
XmlFragment xf = new XmlFragment();
xf.Fragment = xe;
xf.LetterQueueOID = lq.LetterQueueOID;
xf.ParentGroupNodeName = ParentGroupNodeName;
xf.LinkingField = GroupNode.LinkingField;
xf.GroupNodeName = GroupNode.GroupNodeName;
lock (queuedLetters[lqOID])
{
if (lq.Fragments == null)
lq.Fragments = new List<XmlFragment>();
lq.Fragments.Add(xf);
}
ql.Fragments
本身不为空,但枚举中的一个元素为空。我猜这本身就是一个问题,但您可以将语句修改为:
var nextItem = ql.Fragments.Where(x => x != null &&
x.AddedToFinal.Equals(false));
尽管这并不能解决为什么集合中的一个元素一开始就是null的问题
x.AddedToFinal
是bool
,ql.Fragments
不是null
,这个linq语句偶尔会得到这样的异常:
ql.Fragments
的一个元素是null
,所以
x.AddedToFinal
对于ql.Fragments
中的x
抛出一个NullReferenceException
。你可以说
var nextItem = ql.Fragments
.Where(x => x != null)
.Where(x => !x.AddedToFinal);
但是你应该找出为什么在你的集合中有null
元素
我会检查x是否为null
var nextItem = ql.Fragments.Where(x => x != null && x.AddedToFinal.Equals(false));
您确定所有行都有AddedToFinal
的值吗?
System.NullReferenceException: Object reference not set to an instance of an object.
at System.Linq.Enumerable.WhereListIterator1.MoveNext() at System.Linq.Enumerable.Count[TSource](IEnumerable1 source)
在异常中可以看到,Iterator不能移动或读取下一行。