使用原始sql查询加载导航属性

我有这个SQL查询:

SELECT t.ServerId, t.Id, s.Name FROM MyTable as t JOIN Server s ON t.ServerId = S.Id 

我正在运行它:

 context.Database.SqlQuery("query_goes_here"); 

如何配置EF以便它使用查询中的返回数据加载我的实体的Server属性?

基于@octavioccl的回答,我最终做到了这一点:

 foreach(var result in results) { context.Attach(result); context.Entry(result).Reference(p => p.Server).Load(); } 

但是我担心这会造成很多数据库的旅行?

对返回实体类型的查询使用DbSet.SqlQuery方法。 返回的对象必须是DbSet对象所期望的类型,并且除非您关闭跟踪,否则它们将由数据库上下文自动跟踪

 var enties= _context.Entities.SqlQuery("query_goes_here"); 

执行查询后,您应该能够通过延迟加载通过entity实例获取Server

 var server=entity.Server; 

另一方面,即使您使用此方法检索实体类型,数据库上下文也不会跟踪Database.SqlQuery返回的数据。 如果要跟踪使用此方法执行查询后获得的实体,可以尝试以下操作:

 //Attach the entity to the DbContext _context.Entities.Attach(entity); //The Server navigation property will be lazy loaded var server=entity.Server; 

如果已禁用延迟加载,则可以使用DbEntityEntry.Reference()方法显式加载导航属性:

 //Load the Server navigation property explicitly _context.Entry(entity).Reference(c => c.Server).Load(); 

您可以先加载导航属性的所有行,然后加载主实体。 如果您愿意,首先在其上应用filter。

 var servers = context.Servers.Where(m => m.ServerType == "Windows").ToList(); var mytable = context.MyTables.ToList(); 

或使用SqlQuery

 var servers = context.Database.SqlQuery("query_goes_here"); foreach (var serv in servers) context.Servers.Attach(serv); 

然后查询MyTable和EF会将两者链接在一起