LEFT JOIN 与 LINQ 产生 NULL 引用异常
LEFT JOIN with LINQ produces NULL reference exception
我正在尝试将使用 JOIN 的当前代码转换为使用 LINQ 的 LEFT 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);
我尝试根据
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);
我尝试了 SingleOrDefault 和 FirstOrDefault 并且我在 运行 时间内一直得到 NULL 对象引用。示例和我的案例之间的区别在于我正在创建一个新的 FuncViewModel 对象,而不是仅仅创建一个新对象。应该怎样做才能解决这个问题?
我用这段代码解决了
//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);
我正在尝试将使用 JOIN 的当前代码转换为使用 LINQ 的 LEFT 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);
我尝试根据 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);
我尝试了 SingleOrDefault 和 FirstOrDefault 并且我在 运行 时间内一直得到 NULL 对象引用。示例和我的案例之间的区别在于我正在创建一个新的 FuncViewModel 对象,而不是仅仅创建一个新对象。应该怎样做才能解决这个问题?
我用这段代码解决了
//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);