如何与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; }
}

如何与C#中LINQ表达式内部的空字段进行比较

您只需使用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();