2016-05-11 3 views
0

У меня есть этот GroupJoin:Linq GroupJoin с DefaultIfEmpty

var groupjoin = cData.GroupJoin(
      aData, 
      c => c.Id, 
      a => a.Id, 
      (c, joined) => new { c, a = joined.DefaultIfEmpty() }) 
      .ToList(); 

В моих тестовых данных нет ни одного совпадения. Итак, у меня есть этот код:

  var difference = groupjoin.FirstOrDefault(g => 
      g.a == null); 

Я ожидал difference быть анонимный объект со свойством «с», который был объект из cData, и свойство «а», который был нулевым.

Однако g.a == null не является истинным, поэтому FirstOrDefault дает мне нуль для difference. g.a есть, по сути, DefaultIfEmptyIterator и g.a.ToList() дает мне количество 1, и g.a.ToList[0] == null истинно.

Что я здесь сделал неправильно?

+1

Ваше предположение будет правильным, если вы используете 'Join'. 'GroupJoin' отличается, см. Ответ ниже. –

ответ

3

Вот как работает DefaultIfEmpty. Этот метод возвращает коллекцию с одним элементом (по умолчанию используется параметр типа), если коллекция пуста, а не null.

Так что в вашем случае, если совпадений нет, joined.DefaultIfEmpty() вернет коллекцию только одним элементом, то есть null для ссылочных типов.

Если вы хотите null когда joined пуста попробовать что-то вроде этого:

joined.Any() ? joined : null 

Вы можете прочитать больше о DefaultIfEmptyhere.

Смежные вопросы