2016-06-18 2 views
0

아래의 종류의 코드로 '객체 참조가 설정되지 않음'을 표시합니다. 왼쪽 결합을 위해 DefaultIfEmpty()을 추가 할 때 문제가 발생합니다. 그러나 보고서에서 lst1의 네 번째 항목에 대해 PLACE이 없음을 확인해야합니다.목록이있는 LINQ 쿼리 <T> "개체 참조가 개체의 인스턴스로 설정되지 않았습니다."

PLACEnull 인 줄은 어떻게 얻을 수 있습니까? 다음은 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

예 내가 몇 가지 유사한 사례를 발견하지만, 목록 으로 쿼리를 시작 결코 때 . 이 질문은 Chris에 의해 해결되었습니다. itsef (plll) 소스에서 삼항 항을 사용하는 것이 해결책입니다. Linqpad는 또한이 질문의 장점이기도합니다. 모두에게 감사드립니다. G. – GYCO50

답변

2

해당 속성에 액세스하기 전에 plll이 null이 아닌지 확인해야합니다. 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

크리스, 정확히 내가 원했던 점에 감사드립니다! 이전에이 삼원 상태로 시도했지만 잘못된 위치에있었습니다. 해결책은 pll.pla1이 아닌 plll을 확인하는 것입니다! C# 6 itp에 아주 좋습니다. 나는 이것을 빨리 옮길 것이다. . 리거. 가이 – GYCO50

관련 문제