简体   繁体   中英

Linq SelectMany With Null Child

MenuSetup and AccessRules have a one to many relation as described below.

public class MenuSetup
{
    public virtual int MenuId { get; set; }
    public virtual string DisplayText { get; set; }
    public virtual int MenuOrder { get; set; }
    public virtual bool MenuStatus { get; set; }
    public virtual bool HasKids { get; set; }

    public virtual IList<MenuAccessRules> AccessRules { get; set; }
}

    public class MenuAccessRules
{
    public virtual int Id { get; set; }
    public virtual Boolean CanCreate { get; set; }
    public virtual Boolean CanUpdate { get; set; }
    public virtual Boolean CanDelete { get; set; }
    public virtual FamsRoles Roles { get; set; }
    public virtual MenuSetup Menu { get; set; }
}

I want to project the result of the query below in a view model

var result = session.QueryOver<MenuSetup>()
            .Where(p => p.MenuId == id)
            .List();
var vs = result.SelectMany(x => x.AccessRules, (a, b) => new MenuDetailsViewModel
        {
            MenuId = a.MenuId,
            DisplayText = a.DisplayText,
            MenuOrder = a.MenuOrder,
            HasKids = a.HasKids,
            MenuStatus = a.MenuStatus,
            AccessRuleLists = a.AccessRules.
                Select(c => new AccessRulesList { 
                    Id = b.Id, 
                    MenuId = b.Menu.MenuId, 
                    RoleId = b.Roles.RoleId,
                    CanCreate = b.CanCreate, 
                    CanUpdate = b.CanUpdate, 
                    CanDelete = b.CanDelete }).ToList()
        }).SingleOrDefault();

When AccessRules has data, vs returns MenuDetailsViewModel, but when AccessRules is Empty vs returns null.

Please how do i craft my selectMany to return MenuDetailsViewModel irrespective of AccessRules data.

Thanks in advance for your help

Check below code it may help

 var vs = result.SkipWhile(a=> a.AccessRules==null).SelectMany(x => x.AccessRules, (a, b) => new MenuDetailsViewModel
    {
        MenuId = a.MenuId,
        DisplayText = a.DisplayText,
        MenuOrder = a.MenuOrder,
        HasKids = a.HasKids,
        MenuStatus = a.MenuStatus,
        AccessRuleLists = a.AccessRules.
            Select(c => new AccessRulesList { 
                Id = b.Id, 
                MenuId = b.Menu.MenuId, 
                RoleId = b.Roles.RoleId,
                CanCreate = b.CanCreate, 
                CanUpdate = b.CanUpdate, 
                CanDelete = b.CanDelete }).ToList()
    }).SingleOrDefault();

Would something like this:

var vs = result.Select(x => new MenuDetailsViewModel
{
    MenuId = x.MenuId,
    DisplayText = x.DisplayText,
    MenuOrder = x.MenuOrder,
    HasKids = x.HasKids,
    MenuStatus = x.MenuStatus,
    AccessRuleLists = x.AccessRules == null ? null : x.AccessRules.
        Select(c => new AccessRulesList
        {
            Id = c.Id,
            MenuId = c.Menu.MenuId,
            RoleId = c.Roles.RoleId,
            CanCreate = c.CanCreate,
            CanUpdate = c.CanUpdate,
            CanDelete = c.CanDelete
        }).ToList()
}).SingleOrDefault();

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM