2016-06-18 2 views
0

Я получаю ссылку на объект, которая не установлена, с таким кодом ниже. Проблема возникает, когда я добавляю DefaultIfEmpty(), чтобы сделать левое соединение. Но мне нужно увидеть в отчете, что нет PLACE для 4-го пункта lst1.Запрос LINQ со списком <T> «Ссылка на объект не установлена ​​в экземпляр объекта».

Как я могу получить строку, где PLACE is null? Вот мой пример кода из LinqPad.

Если вы раскомментируете строку: new ID(){id1 = 10152 , id2 = null}, вы получите сообщение об ошибке.

var Lst1 = new List<ID> 
{ 
    new ID(){id1 = 10152 , id2= 250}, 
    new ID(){id1 = 10152 , id2 = 1}, 
    new ID(){id1 = 10152 , id2= 106}, 
    //new ID(){id1 = 10152 , id2 = null} 
}; 
var Lst2 = new List<STORE> 
{ 
    new STORE() {sto1 = 10152 , sto2 = "General Store"} 
}; 
var Lst3 = new List<PLACE> 
{ 
    new PLACE() {pla1 = 250 , pla2 = "London"}, 
    new PLACE() {pla1 = 1 , pla2 = "Paris"}, 
    new PLACE() {pla1 = 106 , pla2 = "Miami"} 
}; 

var regsup = 
      (from l in Lst1 
      join st in Lst2 on l.id1 equals st.sto1 
      join pl in Lst3 on l.id2 equals pl.pla1 into pll 
      from plll in pll.DefaultIfEmpty() 
       select new 
       { 
        StoID = st.sto1, 
        Store = st.sto2, 
        PlaceID = plll.pla1, 
        Place = plll.pla2     
       }).Distinct(); 
       regsup.Dump(); 
} 
class ID 
{ 
    public decimal id1 { get; set; } 
    public decimal? id2 { get; set; } 
} 
class STORE 
{ 
    public decimal sto1{ get; set; } 
    public string sto2{ get; set; } 
} 
class PLACE 
{ 
    public decimal pla1{ get; set; } 
    public string pla2{ get; set; } 
} 
+0

Да, я нашел несколько подобных примеров, но никогда при начале запроса со списком , Вопрос разрешен Крисом. Решением является использование тройника на источнике itsef (plll). Linqpad также является плюсом этого вопроса. Спасибо всем. G. – GYCO50

ответ

2

Вы должны проверить, чтобы убедиться, что plll не является нулевым, прежде чем доступ к любой из его свойств. DefaultIfEmpty() возвращает объект по умолчанию, который в этом случае будет null.

Ваш оператор выбора должен быть:

   select new 
       { 
        StoID = st.sto1, 
        Store = st.sto2, 
        PlaceID = plll != null ? plll.pla1 : 0, 
        Place = plll != null ? plll.pla2 : "" 
       }).Distinct(); 

Или при использовании C# 6 вы можете просто:

PlaceID = plll?.pla1, 
Place = plll?.pla2 
+0

Спасибо, Крис, именно то, что я хотел! Раньше я пытался с этим троичным состоянием, но не в том месте. Решение эффективно проверять на plll, а не pll.pla1! Отлично подходит для C# 6 itp. Я быстро перейду к этому. .Regards.Guy – GYCO50

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