繁体   English   中英

linq where子句导致异常

[英]linq where clause causes exception

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

x.AddedToFinal是bool,ql.Fragments不为null这个linq语句偶尔会得到这个异常:

System.NullReferenceException:未将对象引用设置为对象的实例。

System.Linq.Enumerable.Count [TSource](IEnumerable1 source)中的System.Linq.Enumerable.WhereListIterator1.MoveNext()

有一个问题已经应该回答这个问题( linq where子句和count结果为null异常 )但是这是不可能的,因为该字段是一个非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本身不为null,但枚举中的一个元素为null。 我猜这本身就是一个问题,但你可以将语句修改为:

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

虽然这并没有解决为什么集合中的一个元素开头为null的问题。

x.AddedToFinalboolql.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是否为空

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无法移动或读取下一行。 确保所有行都具有此字段的值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM