LINQ是否加载请求中的每个对象?

时间:2015-02-11 09:15:47

标签: c# linq

让我解释一下自己。

在LINQ的帮助下,我向数据库请求了一个对象:

int idGetClient=1;
Client clientToUpdate = context.Client.FirstOrDefault(p=>p.idClient == idGetClient);

在我的模型中,客户端与另一个名为Site的对象相关。所以我只需调用:

就可以轻松地从我的SQL数据库中获取我的Site对象
Site siteToUpdate = clientToUpdate.Site;

所以我想知道这里发生了什么,LINQ ALREADY在我的第一个请求中加载了结果还是请求再次接收我的客户信息并查找我的数据库?

第二个看起来对我来说最合乎逻辑,但我想确定,因为如果第一个案例会发生什么,它会导致一些性能问题。

3 个答案:

答案 0 :(得分:3)

假设您正在使用实体框架,您可以自己挂钩sql语句并查看访问对象时发生的情况 - 例如

 context.Database.Log = Console.Write; 

还可以使用include

确保加载关系
context.Client.Include("Site").FirstOrDefault(p=>p.idClient == idGetClient);

答案 1 :(得分:3)

如果未指定任何其他内容,则您的属性Site将被延迟加载,因此在您尝试访问该属性时,Entity将查询数据库服务器。

如果对数据库服务器的第二次访问会导致性能问题,则可以使用以下命令阻止:

  int idGetClient=1;
  Client clientToUpdate = context.Client
                                 .Include("Site")
                                 .FirstOrDefault(p=>p.idClient == idGetClient);

您可以根据需要添加任意数量的Include,甚至可以加载属性的属性:

  int idGetClient=1;
  Client clientToUpdate = context.Client
                                 .Include("Site")
                                 .Include("Site.SubProperty")
                                 .FirstOrDefault(p=>p.idClient == idGetClient);

Include将强制加载指定属性。

更多信息: https://msdn.microsoft.com/en-us/data/jj574232.aspx

答案 2 :(得分:1)

在大多数情况下,导航属性.Site会导致Site对象延迟加载。即:发出特定的数据库查询。

问题在于细节上有点稀缺,所以我认为:

  • .Site是一个导航属性,表示与数据库中另一个表的关系。
  • 没有完成早期加载的全局配置(对于某些linq提供程序,这是可能的)。

我建议使用SQL事件探查器查看实际向数据库发出的查询(有关原因的原因,请参阅this blogpost。)