我使用以下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.Number或object.Text是否不同。
然而,这给了我一个:
Object reference not set to an instance of an object.
我认为问题是当旧对象有一个Text字段设置为null的答案时
!db.Text.Equals(wb.Text)
无法按照我的预期工作。
我是否可以通过某种方式更改上述比较,以便在文本不同或旧文本为空时以及名为Correct的字段值是否更改时显示为真?
FYI这是我正在使用的对象:
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; }
}
答案 0 :(得分:1)
您可以使用db.Text != wb.Text
。它不会调用任何字符串方法,因此您不会有null
引用。
答案 1 :(得分:0)
您可以尝试以下列方式使用Equals:
Equals(db.Text, wb.Text);
答案 2 :(得分:0)
我有时会使用null-coalescing运算符来生成空的默认集合。
var filteredThings = (collection ?? new Thing[0]).Where(p => Thing.Desirable);
不是很有效率,但如果你预先初始化空数组,它就有它的位置。
答案 3 :(得分:0)
你是对的,假设原因是Text为null。在比较LINQ表达式中的对象时,这是一个常见问题。正如No One指出的那样,解决方案通常是另外与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();