Ошибка в LINQ Left JOIN

Я написал ниже запрос в LINQ для выполнения левого соединения, но его ошибка бросания:

var qry = from c in dc.category_feature_Name_trans_SelectAll_Active()
          join p in dc.product_category_feature_trans_SelectAll()
          on c.cft_id equals p.cft_id into cp
          from p in cp.DefaultIfEmpty()                      
          select new
          {
              c.cft_id,
              c.feature_id,
              c.feature_name,
              p.product_id ,
              p.value 
          };

Ошибка:

Object reference not set to an instance of an object.
Description: An unhandled exception occurred during the execution of the 
current web request. Please review the stack trace for more information about
the error and where it originated in the code.

Exception Details: System.NullReferenceException: Object reference not set to an instance of an object.

Source Error:

Line 57:                       on c.cft_id equals p.cft_id into cp
Line 58:                       from p in cp.DefaultIfEmpty()                      
error Line 59:                       select new
Line 60:                       {
Line 61:                           c.cft_id,

Пожалуйста, помогите мне.

Ответ 1

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

Это означает, что вы должны учитывать тот факт, что p в

from p in cp.DefaultIfEmpty()

может быть нулевым. Теперь вы действительно не сказали, что хотите в этом случае. Возможно, вы захотите что-то вроде этого:

var qry = from c in dc.category_feature_Name_trans_SelectAll_Active()
          join p in dc.product_category_feature_trans_SelectAll()
          on c.cft_id equals p.cft_id into cp
          from p in cp.DefaultIfEmpty()                      
          select new
          {
              c.cft_id,
              c.feature_id,
              c.feature_name,
              product_id = p == null ? null : p.product_id,
              value = p == null ? null : p.value 
          };

... или вам может потребоваться некоторая другая обработка. Мы не знаем типы p.product_id или p.value, что не помогает. (Например, вам потребуется немного больше работы с указанным выше кодом, если product_id - тип значения.)

Ответ 2

Вы делаете левое соединение, поэтому p может быть null. Вы должны учитывать это.

Вот запрос, который должен работать, хотя я точно не знаю, что это за значение p.value. Запрос будет работать, если значение является ссылочным типом. Если значением является тип значения, чем использование литого, похожее на product_id cast.

var qry = from c in dc.category_feature_Name_trans_SelectAll_Active()
            join p in dc.product_category_feature_trans_SelectAll()
            on c.cft_id equals p.cft_id into cp
            from p in cp.DefaultIfEmpty()
            select new
            {
                c.cft_id,
                c.feature_id,
                c.feature_name,
                product_id = p == null ? (int?)null : p.product_id,
                value = p == null ? null : p.value,
            };