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

Linq where子句导致异常

ql.Fragments本身不为空,但枚举中的一个元素为空。我猜这本身就是一个问题,但您可以将语句修改为:

var nextItem = ql.Fragments.Where(x => x != null && 
                                       x.AddedToFinal.Equals(false));

尽管这并不能解决为什么集合中的一个元素一开始就是null的问题

x.AddedToFinalbool, 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不能移动或读取下一行。