C# 不确定如何访问C Linq中的包含数据

C# 不确定如何访问C Linq中的包含数据,c#,linq,entity-framework-6,C#,Linq,Entity Framework 6,晚上好, 我希望有人能帮我完成一个我正在做的项目 在我真正开始之前,我只想说清楚一点,我以前从未做过类似的事情,我在家里涉猎过,我不是C开发人员或数据库管理员。因此,请原谅我在最佳实践中的任何休息,这是总共4周值得学习的时间,我的头撞在桌子上试图跟上一个令人困惑的话题 因此,我以某种方式结束了创建大量网站的任务,为了让自己更容易,我尝试创建一个模板系统,在该系统中,我使用布局页面中的许多部分页面/部分,通过数据驱动网站 我已经创建了下面的数据库结构,试图考虑所有我需要的事情,比如打开和关闭部件,

晚上好, 我希望有人能帮我完成一个我正在做的项目

在我真正开始之前,我只想说清楚一点,我以前从未做过类似的事情,我在家里涉猎过,我不是C开发人员或数据库管理员。因此,请原谅我在最佳实践中的任何休息,这是总共4周值得学习的时间,我的头撞在桌子上试图跟上一个令人困惑的话题

因此,我以某种方式结束了创建大量网站的任务,为了让自己更容易,我尝试创建一个模板系统,在该系统中,我使用布局页面中的许多部分页面/部分,通过数据驱动网站

我已经创建了下面的数据库结构,试图考虑所有我需要的事情,比如打开和关闭部件,以及创建一个创建菜单结构的控件

在此基础上,我创建了下面的类,该类创建了所有各种视图模型,我希望将这些模型传递给布局中的每个部分。站点上有多个相关部分,因此这些部分而不是一个巨大的布局

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;
        }
    }
}
当我非常确定我可以使用时。在顶部包括一些方法和使用方法。改为注明价值

但我似乎不知道该怎么做

我希望这是有意义的,任何反馈都将不胜感激

编辑-因此,为了在此基础上进行构建,基本上我有一个布局,它构建一个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>
它把所有的部分都拉进去了

然后,每个页面都从该布局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类的作用,Include允许您指示哪些相关实体应该作为同一查询的一部分从数据库中读取。它允许您出于性能目的进行即时加载

默认情况下,DbContext类支持延迟加载,当第一次读取实体时,不会检索相关数据。但是,首次尝试访问导航属性时,将自动检索该导航属性所需的数据。这将导致向数据库发送多个查询


您可以包含所需的相关数据,并将其保存到变量中以供进一步处理

我认为数据库是由行和列组成的平面二维数组。您可以将数据分解到表中以节省内存,这样就不必多次重复相同的数据。例如,您有一个ID为的学生。因此,一个表包含学生信息,如家庭地址、电话、电子邮件。另一个表包含学生班级,如班级名称、ID、位置、教师,第三个表包含学生ID、班级ID、年级。因此,它是一个excel工作簿,每个工作表包含一个班级。您的查询正在联接表,因此您至少需要三个选项1选择表2选择列。3罗你做的手工制图太多了,我从没见过这样的东西。这应该或多或少自动映射。在类内创建一些方法并使用复制构造函数。对不起,我真的没有经验,而且我对术语有点迷茫,你的意思是这样做:公共类RoutedDetails{public string Area{get;set;}public RoutedDetails controllerContext controllerContext=null{Area=controllerContext?.RouteData.DataTokens[Area]?.ToString;}我想我正在苦苦挣扎,因为我正沿着db的链条从顶级表返回另一条路径。我不知道如何从符号的角度访问包含的数据,或者是否只是整个代码构思不周,这在我的经验水平上更可能。因此,如果我这样做:。Includea=>a.table。选择b=>新的vm{datafroma=?}或者,我只是误解了您的意思,添加include将在初始查询中引入数据,但我仍然以相同的方式访问它?
    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);
    }