Эффективное сопоставление моделей - PullRequest
0 голосов
/ 02 июля 2019

Я немного новичок в ядре asp.net. В этом запросе он продолжает запрашивать БД на каждом узле для сопоставления от OrgStructures до ToOrgStructureModel, есть ли способ сделать это более эффективным:

Это область, где он продолжает запрашивать БД: .Select(org => org.ToOrgStructureModel(db.OrgStructures.Where(s => s.ParentNodeId == org.NodeId).Count() > 0))

Весь запрос:

public virtual IList<OrgStructureModel> GetAll()
{

    using (var db = _context)
    {
        var result = db.OrgStructures
                .Where(e => e.FiscalYear == 19)
                .Select(org => org.ToOrgStructureModel(db.OrgStructures.Where(s => s.ParentNodeId == org.NodeId).Count() > 0))
                .ToList();

        _session.SetObjectAsJson("OrgStructure", result);

        return result;
    }
}

ToOrgStructureModel:

public static OrgStructureModel ToOrgStructureModel(this OrgStructure org, bool hasChildren)
{
    return new OrgStructureModel
    {
        NodeId = org.NodeId,
        ParentNodeId = org.ParentNodeId,
        Name = org.Name,
        DepartmentCode = org.DepartmentCode,
        Acronym = org.Acronym,
        LegacyId = org.LegacyId,
        hasChildren = hasChildren
    };
}

OrgStructureModel:

public class OrgStructureModel
    {
        [ScaffoldColumn(false)]
        public int? NodeId { get; set; }

        [Required]
        public string Name { get; set; }

        public string Acronym { get; set; }

        public string DepartmentCode { get; set; }

        public int? ParentNodeId { get; set; }

        public int? LegacyId { get; set; }

        public int FiscalYear { get; set; }

        public int DepartmentId { get; set; }


    [ScaffoldColumn(false)]
        public bool hasChildren { get; set; }
        public OrgStructure ToEntity()
        {
            return new OrgStructure
            {
                NodeId = NodeId,
                Name = Name,
                Acronym = Acronym,
                ParentNodeId = ParentNodeId,
                DepartmentCode = DepartmentCode,
                LegacyId = LegacyId,
                FiscalYear = FiscalYear,
                DepartmentId = DepartmentId
            };
        }
    }

Ответы [ 2 ]

2 голосов
/ 03 июля 2019

Вы создаете много запросов, по существу, для каждой извлекаемой записи он будет запрашивать еще раз для каждой из них проверку на hasChildren.

Включить ссылку на дочернего элемента вВаша основная модель (если это коллекция, сделайте ее коллекцией),

public class OrgStructureModel
{
    ...
    public int? ChildId {get;set;}
    public OrgStructureModel Child {get;set;}
}

И тогда вы можете создать чек в запросе

     var result = db.OrgStructures
            .Where(e => e.FiscalYear == 19 && e.ChildId != null)
            .Select(org => org.ToOrgStructureModel())
            .ToList();

Также прочитайте это сообщение в блоге о проекции.

2 голосов
/ 03 июля 2019

Избегайте использования пользовательских методов при использовании Linq-to-sql.

Вот рабочая альтернатива, в которой не используется ToOrgStructureModel метод:

var result = db.OrgStructures
    .Where(e => e.FiscalYear == 19)
    .Select(org => new OrgStructureModel 
    {
        NodeId = org.NodeId,
        ParentNodeId = org.ParentNodeId,
        Name = org.Name,
        DepartmentCode = org.DepartmentCode,
        Acronym = org.Acronym,
        LegacyId = org.LegacyId,
        // Notice using "Any" method instead of comparing count with 0
        hasChildren = db.OrgStructures.Any(s => s.ParentNodeId == org.NodeId),
    })
    .ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...