首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在lambda表达式中指定Include

如何在lambda表达式中指定Include
EN

Stack Overflow用户
提问于 2013-07-24 21:40:10
回答 3查看 743关注 0票数 1

我有一个机架模型和一个服务器模型。目前,当我想要检索单个服务器时,我会执行以下操作,以指定显式加载:

代码语言:javascript
运行
复制
public Server FindAllServer(int id)
        {

            return project.Servers.Where(c => c.ServerID == id)
                .Include(a => a.OperatingSystem)
                .Include(a2 => a2.DataCenter)
                .Include(a3=>a3.Rack)
                .Include(a4=>a4.ServerModel)
                .Include(a5=>a5.Technology)
                .Include(a6=>a6.VirtualMachines)
                .Include(a7=>a7.TechnologyStatu)
                .Include(a8=>a8.TechnologyBackUpStatu)
                .Include(a9=>a9.TechnologyRole)
                .SingleOrDefault();
        }

代码语言:javascript
运行
复制
 public Rack FindAllRack(int id)
        {

            return project.Racks.Where(c => c.RackID == id)
                .Include(a => a.Servers)
                .Include(a2 => a2.DataCenter)
                .Include(a3 => a3.Firewalls)
                .Include(a4 => a4.Routers)
                .Include(a5 => a5.Technology)
                .Include(a6 => a6.StorageDevices)
                .Include(a7=>a7.Switches)
                .Include(a8=>a8.Zone)
                .SingleOrDefault();
        }

因此,我不确定如何定义在机架下显式包含服务器的所有导航属性,因为我不能编写以下内容:

代码语言:javascript
运行
复制
project.Racks.Where(c => c.RackID == id).Include(a => a.Servers.Include(………))

问题是,如果我在一个机架下有50台服务器,那么对于每台服务器,将有大约7个请求来检索服务器导航属性,所以我将有大约350个请求!

EN

回答 3

Stack Overflow用户

发布于 2013-07-24 22:24:37

我认为您应该能够通过指定属性路径来实现Include()的基于字符串的重载,例如

代码语言:javascript
运行
复制
project.Racks.Where(c => c.RackID == id).Include("Servers.SomePropertyOfServer")

编辑:在做了更多的研究之后,看起来这也是可行的:

project.Racks.Where(c => c.RackID == id).Include(a => a.Servers.Select(s => s.SomePropertyOfServer))

有关示例,请参阅this link,特别是标题为“急切加载多个级别”的部分。

票数 1
EN

Stack Overflow用户

发布于 2013-07-25 21:16:46

如果您所需要的只是各种子对象的计数,请考虑以下内容。它应该向数据库发出一个请求,最多只能获取2行。分析请求以确保情况属实,因为我尚未对其进行测试。

代码语言:javascript
运行
复制
        return project.Racks.Where(c => c.RackID == id)
            .Select(a => new {
                serverCount = a.Servers.Count(),
                dataCenterCount = a.DataCenter.Count(),
                firewallCount = a.Firewalls.Count(),
                routerCount = a.Routers.Count(),
                technologyCount = a.Technology.Count(),
                storageDeviceCount = a.StorageDevices.Count(),
                switchCount = a.Switches.Count(),
                zoneCount = a.Zone.Count()
            }).SingleOrDefault();

此外,如果您不打算在获得多个记录时抛出异常,请使用FirstOrDefault而不是SingleOrDefault。

票数 1
EN

Stack Overflow用户

发布于 2013-07-24 22:23:29

你试过这个吗?

代码语言:javascript
运行
复制
return project.Servers
              .Include(a => a.OperatingSystem)
              .Include(a2 => a2.DataCenter)
              .Include(a3=>a3.Rack)
              .Include(a4=>a4.ServerModel)
              .Include(a5=>a5.Technology)
              .Include(a6=>a6.VirtualMachines)
              .Include(a7=>a7.TechnologyStatu)
              .Include(a8=>a8.TechnologyBackUpStatu)
              .Include(a9=>a9.TechnologyRole)
              .Where(srv => srv.Rack.RackID == id);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17835741

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档