2016-09-01 1 views
0

LINQ를 사용하여 LEFT JOIN에 JOIN을 사용하여 현재 코드를 변환하려고합니다. 이 LEFT JOIN (LINQ 포함)은 NULL 참조 예외를 생성합니다.

LEFT로 변환 할 내 시도를 내가 SingleOrDefault 및 FirstOrDefault와 I를 시도 How do you perform a left outer join using linq extension methods

//Unassigned 
 
      editSecRoleViewModel.UnassignedFunctions = editSecRoleViewModel.UnassignedFunctions.GroupJoin(globalFunctions, 
 
       uf => uf.FuncCode, gf => gf.FuncCode, 
 
        (uf, gf) => new FuncViewModel() 
 
        { 
 
         Descrip = uf.Descrip, 
 
         FuncCode = uf.FuncCode, 
 
         Grouping = uf.Grouping, 
 
         Progmodule = uf.Progmodule, 
 
         SubCat = uf.SubCat, 
 
         GrantPerm = (byte)(((int?)gf.FirstOrDefault().GrantPerm??1) | uf.GrantPerm), 
 
         DefaultGrantPerm = (byte) ((int?)gf.FirstOrDefault().GrantPerm ?? 1) 
 
        }).OrderBy(x => x.Descrip);

에 따라 JOIN 현재 코드

globalFunctions = _rolesAdapter.GetSecurityRightsForRole(SysManagerConstants.GLOBAL_DEFAULTS_ROLE_NUMBER, "SecFunc"). 
 
       Select(secRight => new FuncViewModel() 
 
       { 
 
        Descrip = secRight.SecFunc.Descrip, 
 
        FuncCode = secRight.SecFunc.FuncCode, 
 
        Grouping = secRight.SecFunc.Grouping, 
 
        Progmodule = secRight.SecFunc.Progmodule, 
 
        SubCat = secRight.SecFunc.SubCat, 
 
        GrantPerm = secRight.GrantPerm 
 
       }).OrderBy(x => x.Descrip); 
 

 
      //Unassigned 
 
      editSecRoleViewModel.UnassignedFunctions = editSecRoleViewModel.UnassignedFunctions.Join(globalFunctions, uf => uf.FuncCode, gf => gf.FuncCode, 
 
        (uf, gf) => new FuncViewModel() 
 
        { 
 
         Descrip = uf.Descrip, 
 
         FuncCode = uf.FuncCode, 
 
         Grouping = uf.Grouping, 
 
         Progmodule = uf.Progmodule, 
 
         SubCat = uf.SubCat, 
 
         GrantPerm = (byte)(gf.GrantPerm | uf.GrantPerm), 
 
         DefaultGrantPerm = gf.GrantPerm 
 
        }).OrderBy(x => x.Descrip);
입니다 계속하다 실행시에 NULL 객체 참조를 검출한다. 샘플과 필자의 차이점은 새로운 FuncViewModel 객체를 새로운 객체로 만드는 것입니다. 문제를 해결하기 위해 무엇을해야합니까?

답변

0

는이 코드

//Unassigned 
 
      editSecRoleViewModel.UnassignedFunctions = editSecRoleViewModel.UnassignedFunctions.SelectMany( 
 
       uf => globalFunctions.Where(gf => uf.FuncCode== gf.FuncCode).DefaultIfEmpty(), 
 
        (uf, gf) => new FuncViewModel() 
 
        { 
 
         Descrip = uf.Descrip, 
 
         FuncCode = uf.FuncCode, 
 
         Grouping = uf.Grouping, 
 
         Progmodule = uf.Progmodule, 
 
         SubCat = uf.SubCat, 
 
         GrantPerm = (byte)(((gf==null)?1:gf.GrantPerm) | uf.GrantPerm) , 
 
         DefaultGrantPerm = ((gf == null) ? (byte)1 : gf.GrantPerm) 
 
        }).OrderBy(x => x.Descrip);

으로 해결