如何与C#中LINQ表达式内部的空字段进行比较
本文关键字:字段 比较 内部 表达式 LINQ | 更新日期: 2023-09-27 18:29:21
我正在使用以下LINQ来比较两个对象列表。
var upd = newObj.Where(wb => oldObj.Any(db =>
(db.AnswerId == wb.AnswerId) &&
(db.Number != wb.Number || !db.Text.Equals(wb.Text))))
.ToList();
当AnswerId匹配时,我会查看对象是否匹配。数字或对象。文本不同。
然而,这给了我一个:
Object reference not set to an instance of an object.
我认为问题是当旧对象有一个文本字段设置为空的答案时,
!db.Text.Equals(wb.Text)
未能按我预期的方式工作。
如果文本不同或旧文本为空,以及名为Correct的字段的值发生变化,是否有办法更改上述比较,使其显示为真?
仅供参考这是我正在使用的对象:
public class Answer {
public int AnswerId { get; set; }
public int Number { get; set; }
public int QuestionId { get; set; }
public Nullable<bool> Correct { get; set; }
public Nullable<bool> Response { get; set; }
public string Text { get; set; }
}
您只需使用db.Text != wb.Text
即可。它没有调用任何字符串方法,因此不会有null
引用。
您可以尝试以以下方式使用Equals:
Equals(db.Text, wb.Text);
我有时会使用null合并运算符来生成空的默认集合。
var filteredThings = (collection ?? new Thing[0]).Where(p => Thing.Desirable);
性能不高,但如果您预先初始化空数组,它就有它的位置。
您认为原因是Text为null是正确的。在比较LINQ表达式中的对象时,这是一个常见的问题。正如没有人指出的那样,解决方案通常是额外地与null进行比较。然而,在您的情况下,解决方案更简单:只需比较使用!=(Text是一个字符串,因此!=与!db.Text.Equals相同):
var upd = newObj.Where(wb => oldObj.Any(db => (db.AnswerId == wb.AnswerId) &&
(db.Number != wb.Number || db.Text != wb.Text))).ToList();