![](/img/trans.png)
[英]Linq to Entities NOT throwing Null reference exception for Left Join
[英]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);
我嘗試根據如何使用linq擴展方法執行左外部聯接轉換為LEFT JOIN
//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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.