我有一个机架模型和一个服务器模型。目前,当我想要检索单个服务器时,我会执行以下操作,以指定显式加载:
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();
} 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();
}因此,我不确定如何定义在机架下显式包含服务器的所有导航属性,因为我不能编写以下内容:
project.Racks.Where(c => c.RackID == id).Include(a => a.Servers.Include(………))问题是,如果我在一个机架下有50台服务器,那么对于每台服务器,将有大约7个请求来检索服务器导航属性,所以我将有大约350个请求!
发布于 2013-07-24 22:24:37
我认为您应该能够通过指定属性路径来实现Include()的基于字符串的重载,例如
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,特别是标题为“急切加载多个级别”的部分。
发布于 2013-07-25 21:16:46
如果您所需要的只是各种子对象的计数,请考虑以下内容。它应该向数据库发出一个请求,最多只能获取2行。分析请求以确保情况属实,因为我尚未对其进行测试。
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。
发布于 2013-07-24 22:23:29
你试过这个吗?
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);https://stackoverflow.com/questions/17835741
复制相似问题