2017-06-01 105 views
0

我第一次使用实体框架。我写了下面的简单查询:使用实体框架返回所有相关实体

public List<Request> GetResult(string code) 
{ 
    List<Request> requests = new List<Request>(); 

    using (var db = new Context()) 
    { 
     requests = (from c in db.Requests where c.Code == code select c).ToList(); 
    } 

    return requests; 
} 

有几个相关实体的Request对象,如具有与Request表1对1的关系Results表。但是他们全都回来了。

我该如何查询实体框架并返回一个实体及其所有相关实体?

TIA

+0

您使用的是什么版本的实体框架?你可以发布你的'Request'对象吗? – Steve

+0

https://stackoverflow.com/questions/14512285/entity-framework-is-there-a-way-to-automatically-eager-load-child-entities-wit – spender

回答

2
使用预先加载集

单查询

db.Requests.Where(req => req.Code == code) 
    .Include(req => req.Results) // Joining is performed here 
    .Include(req => req.SomeOtherProperty) 
    .ToList() 
使用

// Hits the database once. 
var requests = db.Requests.Where(req => req.Code == code).ToList(); 
var requestIDs = requests.Select(req => req.ID); 
// Hits the database another time to load your Results property. 
db.Results.Where(res => requestIDs.Contains(res.RequestID)).Load(); 

如果延迟加载启用了明确的装载个

多个查询,每次你访问Request列表Results属性,查询被执行到数据库加载它适合你,这可能导致在N上+1问题。尽管惰性加载在EntityFramework Core上尚不可用。

+0

添加System.Data.Entity命名空间后,您的加载示例很好地完成了这个技巧。谢谢! – Nugs

0

如果你要选择的对象被加载使用

db.Entry(Requests).Reference(p => p.Code).Load(); 

如果你想在你的DataContext构造函数自动加载所有

this.Configuration.LazyLoadingEnabled = true; 
+0

'LazyLoadingEnabled'为请求发出一个新的查询一个卸载的虚拟财产。根据OP的要求,它不会自动加载这些属性。 – spender