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

时间:2013-08-28 07:48:24

标签: c# linq

我使用以下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; }

}

4 个答案:

答案 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();