Не знаете, как получить доступ к Включить данные в C# Linq - PullRequest
0 голосов
/ 23 февраля 2020

Вечером все, я надеялся, что кто-то может помочь мне вместе с проектом, над которым я работаю.

Непосредственно перед тем, как я действительно начну, я просто хочу прояснить это, я никогда ничего не делал как прежде, чем поболтать дома, я не являюсь C# разработчиком или администратором базы данных. Поэтому прошу прощения за любые перерывы в передовой практике, это всего 4 недели обучения, и я стучу головой по столу, пытаясь следовать тихой запутанной топи c.

Так что я (каким-то образом) закончил до того, как мне было поручено создать несколько веб-сайтов, и в попытке сделать это проще для себя, я попытался создать «шаблонную» систему, в которой я использую несколько частичных страниц / частей на странице макета для управления веб-сайтом с помощью данных. .

Я создал приведенную ниже структуру базы данных, пытаясь продумать все, что мне понадобится, например, включение и выключение деталей и создание элемента управления, создающего структуру меню.

Диаграмма моделей

на обратной стороне того, что я создал нижеуказанный класс, который создает все различные модели представлений, которые я хочу передать каждой частичной части в моем макете (есть несколько зависимых на сайте, следовательно, части вместо одного гигантского макета).

public class PageDetails
{
    public static async Task<DataPageDetailsVM> Get(int companyID, ControllerContext controllerContext)
    {
        using (var dimensionContext = new DimensionContext())
        {
            var cDNAddress    = await CDNAddress.Get();
            var aPIAddress    = await APIAddress.Get();

            var routeDetails  = new RouteDetails(controllerContext);
            var canonicalPath = CanonicalPath.Get(routeDetails);

            var pageDetailsVM = await dimensionContext.PageDetail
                .Where(pde => pde.PageAction.PageController.PageArea.Company.CompanyID == companyID
                              && (pde.PageAction.PageController.PageArea.Area == (routeDetails.Area ?? "Home") 
                                  && !pde.PageAction.PageController.PageArea.Excluded)
                              && (pde.PageAction.PageController.Controller == routeDetails.Controller 
                                  && !pde.PageAction.PageController.Excluded)
                              && (pde.PageAction.Action == routeDetails.Action 
                                  && !pde.PageAction.Excluded))
                .Select(pde => new DataPageDetailsVM
                {
                    PageActionID     = pde.PageActionID,
                    CDNAddress       = cDNAddress,
                    APIAddress       = aPIAddress,
                    Title            = pde.Title,
                    FormattedTitle   = pde.FormattedTitle,
                    TagLine          = pde.TagLine,
                    StrapLine        = pde.StrapLine,

                    Latitude         = pde.PageAction.PageController.PageArea.Company.CompanyAddress
                        .Select(sca => sca.Latitude)
                        .FirstOrDefault(),
                    Longitude        = pde.PageAction.PageController.PageArea.Company.CompanyAddress
                        .Select(sca => sca.Longitude)
                        .FirstOrDefault(),

                    DataRouteVM = new DataRouteVM
                    {
                        PrimaryDomain = pde.PageAction.PageController.PageArea.Company.CompanySettings
                            .Select(scs => scs.PrimaryDomain)
                            .FirstOrDefault(),
                        Area          = (routeDetails.Area ?? "Home"),
                        Controller    = routeDetails.Controller,
                        Action        = routeDetails.Action
                    },

                    DataCompanyVM = new DataCompanyVM
                    {
                        CompanyID = companyID,
                        ShortName = pde.PageAction.PageController.PageArea.Company.ShortName,
                        LongName  = pde.PageAction.PageController.PageArea.Company.LongName
                    },

                    PartHeaderVM = new PartHeaderVM
                    {
                        ShortName  = pde.PageAction.PageController.PageArea.Company.ShortName,
                        CDNAddress =  cDNAddress
                    },

                    PartMetaVM = pde.PageAction.PageController.PageArea.Company.CompanySettings 
                        .Select(cse => new PartMetaVM
                        {
                            ShortName        = pde.PageAction.PageController.PageArea.Company.ShortName,
                            ShortDescription = pde.ShortDescription,
                            LongDescription  = pde.LongDescription,
                            Keywords         = pde.Keywords,
                            MsValidate       = cse.MsValidate,
                            FbAppID          = cse.FbAppID,
                            CanonicalPath    = cse.PrimaryDomain + "/" + canonicalPath,
                            OgImage          = cse.PrimaryDomain + "/" + pde.OgImage,
                            ThemeColor       = cse.ThemeColor
                        })
                        .FirstOrDefault(),

                    PartLinksVM = new PartLinksVM
                    {
                        CanonicalPath = pde.PageAction.PageController.PageArea.Company.CompanySettings
                            .Select(cse => cse.PrimaryDomain)
                            .FirstOrDefault() + "/" + canonicalPath,
                    },

                    PartBreadcrumbVM = new PartBreadcrumbVM
                    {
                        BreadcrumbImage = cDNAddress + pde.BreadcrumbImage,
                        Area            = (routeDetails.Area ?? "Home"),
                        Controller      = routeDetails.Controller,
                        Action          = routeDetails.Action,
                        Title           = pde.Title,
                        TagLine         = pde.TagLine
                    },

                    PartFooterVM = new PartFooterVM
                    {
                        CDNAddress = cDNAddress,

                        DataCompanyAddressVM = pde.PageAction.PageController.PageArea.Company.CompanyAddress
                            .Select(cad => new DataCompanyAddressVM
                            {
                                ShortName    = cad.Company.ShortName,
                                LongName     = cad.Company.LongName,
                                Registration = cad.Company.Registration,
                                AddressLine1 = cad.AddressLine1,
                                AddressLine2 = cad.AddressLine2,
                                AddressLine3 = cad.AddressLine3,
                                AddressLine4 = cad.AddressLine4,
                                Postcode     = cad.Postcode,
                                Phone        = cad.Phone
                            })
                            .FirstOrDefault(),

                        DataCompanySocialVM = pde.PageAction.PageController.PageArea.Company.CompanySocial
                            .Select(cso => new DataCompanySocialVM
                            {
                                FacebookAddress = cso.FacebookAddress,
                                LinkedInAddress = cso.LinkedInAddress,
                                TwitterAddress  = cso.LinkedInAddress
                            })
                            .FirstOrDefault()
                    }
                })
                .FirstAsync();

            return pageDetailsVM;
        }
    }
}

Мой вопрос заключается в том, что мне нужно сделать несколько нажатий кнопки su ch as:

pde.PageAction.PageController.PageArea.Company.CompanySettings
                        .Select(scs => scs.PrimaryDomain)
                        .FirstOrDefault(),

Когда я почти уверен, что могу использовать .Включите в начало некоторые способы использования и использования a. вместо этого записанное значение.

Но я не могу понять, как.

Я надеюсь, что это имеет смысл, и любая обратная связь будет оценена.

Редактировать - так что просто построить на этом, в основном, у меня есть макет, который строит все биты из класса layoutvm, а затем передает все «биты» всем частям

<body class="loading-overlay-showing" data-plugin-page-transition data-loading-overlay data-plugin-options="{'hideDelay': 500}">
@Html.Partial("~/Views/Shared/DisplayTemplates/_Loader.cshtml")
<div class="body">
    @if (isCustomerArea)
    {
        @Html.Partial("~/Areas/Customer/Views/Shared/DisplayTemplates/_Header.cshtml", Model.DataPageDetailsVM.PartHeaderVM)

    }
    else
    {
        @Html.Partial("~/Views/Shared/DisplayTemplates/_Header.cshtml", Model.DataPageDetailsVM.PartHeaderVM)
    }
    <main>
        @if ((ViewContext.RouteData.Values["controller"].ToString() == "Home" && ViewContext.RouteData.Values["action"].ToString() != "Index") || ViewContext.RouteData.Values["controller"].ToString() != "Home")
        {
            @Html.Partial("~/Views/Shared/DisplayTemplates/_Breadcrumb.cshtml", Model.DataPageDetailsVM.PartBreadcrumbVM)
        }
        @RenderBody()
    </main>
    @if (isCustomerArea)
    {
        @Html.Partial("~/Areas/Customer/Views/Shared/DisplayTemplates/_Footer.cshtml", Model.DataPageDetailsVM.PartFooterVM)

    }
    else
    {
        @Html.Partial("~/Views/Shared/DisplayTemplates/_Footer.cshtml", Model.DataPageDetailsVM.PartFooterVM)
    }
</div>
<section>
    @Scripts.Render(Model.DataPageDetailsVM.CDNAddress + "Common/js-footer")
    @Scripts.Render(Model.DataPageDetailsVM.CDNAddress + CompanyDetails.COMPANYID + "/js-footer")
    @RenderSection("scripts", required: false)
</section>

У меня есть класс макета:

    public abstract class LayoutVM
{
    public virtual DataPageDetailsVM DataPageDetailsVM { get; set; }
}

, который вытягивает все биты.

Затем каждая страница наследуется от этого макета vm:

    public class PageRetailVM : LayoutVM
{
    public SuggestedServicesVM SuggestedServicesVM { get; set; }
}

тогда мой контроллер страницы становится очень простым, не только Я получаю доступ ко всем данным макета, но код страницы становится очень маленьким:

    [HttpGet]
    [AllowAnonymous]
    public async Task<ActionResult> Retail()
    {
        PageRetailVM pageRetailVM = new PageRetailVM
        {
            DataPageDetailsVM   = await PageDetails.Get(CompanyDetails.COMPANYID, ControllerContext),
            SuggestedServicesVM = await PartSuggestedServices.Get(CompanyDetails.COMPANYID, ControllerContext)
        };

        return View(pageRetailVM);
    }

Вот для чего предназначен класс PageDetails

1 Ответ

1 голос
/ 23 февраля 2020

Включить () позволяет указать, какие связанные объекты следует читать из базы данных как часть одного и того же запроса. Это позволяет вам быстро загружать для повышения производительности.

Класс DbContext по умолчанию включает отложенную загрузку, когда объект впервые читается, связанные данные не извлекаются. Однако при первой попытке доступа к свойству навигации данные, необходимые для этого свойства навигации, автоматически извлекаются. Это приводит к нескольким запросам, отправляемым в базу данных.

Вы можете включить () связанные данные, которые вам нужны, и просто сохранить их в переменной для дальнейшей обработки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...